这些表达式是在C中定义的吗?

问题描述 投票:0回答:1

这些表达式定义了吗?

    int x = 5, y;
    y = ++(int){++x};
    //or 
    y = (int){x++}++;

并且(我找不到任何不被定义的理由)

    int x = 5;
    x = ++(int){++x};
    //or 
    x = (int){x++}++;

IMO 有明确的序列点,其中创建新对象(复合文字)。

c language-lawyer undefined-behavior
1个回答
1
投票

这些都很好:

y = ++(int){++x};
y = (int){x++}++;

因为没有对象被读取或写入超过一次,特别是

x
y
和未命名的复合文字。

相反,这些会触发未定义的行为:

x = ++(int){++x};
x = (int){x++}++;

因为

x
在没有序列点的情况下被修改多次,因为使用复合文字不会引入序列点。

C 标准第 6.8p4 节规定以下内容(不是粗体部分):

A

完整表达式 是不属于另一个表达式的一部分 表达式或声明符。以下每一项都是完整的 表达式:不属于复合文字的初始化器;这 表达式语句中的表达式; a 的控制表达 选择语句(if

switch
); a 的控制表达
while
do
 声明; 
for
 的每个(可选)表达式
陈述; 
return
 语句中的(可选)表达式。有一个
完整表达式的求值和
评估下一个要评估的完整表达式。

在上面的示例中,由于

++x

 是复合文字初始化程序的一部分,因此它不符合完整表达式,因此复合文字没有引入序列点。

© www.soinside.com 2019 - 2024. All rights reserved.