这些表达式定义了吗?
int x = 5, y;
y = ++(int){++x};
//or
y = (int){x++}++;
并且(我找不到任何不被定义的理由)
int x = 5;
x = ++(int){++x};
//or
x = (int){x++}++;
IMO 有明确的序列点,其中创建新对象(复合文字)。
这些都很好:
y = ++(int){++x};
y = (int){x++}++;
因为没有对象被读取或写入超过一次,特别是
x
、y
和未命名的复合文字。
相反,这些会触发未定义的行为:
x = ++(int){++x};
x = (int){x++}++;
因为
x
在没有序列点的情况下被修改多次,因为使用复合文字不会引入序列点。
A在上面的示例中,由于完整表达式 是不属于另一个表达式的一部分 表达式或声明符。以下每一项都是完整的 表达式:不属于复合文字的初始化器;这 表达式语句中的表达式; a 的控制表达 选择语句(
if
或switch
); a 的控制表达while
或do
声明;for
的每个(可选)表达式 陈述;return
语句中的(可选)表达式。有一个 完整表达式的求值和 评估下一个要评估的完整表达式。
++x
是复合文字初始化程序的一部分,因此它不符合完整表达式,因此复合文字没有引入序列点。