Are these expressions defined?个
int x = 5, y;
y = ++(int){++x};
//or
y = (int){x++}++;
和(我找不到任何理由不被定义)
int x = 5;
x = ++(int){++x};
//or
x = (int){x++}++;
在创建新对象(复合文字)的位置有明确的序列点.
Are these expressions defined?个
int x = 5, y;
y = ++(int){++x};
//or
y = (int){x++}++;
和(我找不到任何理由不被定义)
int x = 5;
x = ++(int){++x};
//or
x = (int){x++}++;
在创建新对象(复合文字)的位置有明确的序列点.
这些都很好:
y = ++(int){++x};
y = (int){x++}++;
因为没有对象被多次读取或写入,特别是x
、y
和未命名的复合文字.修改复合文字也不是问题,因为(在本例中)它具有自动存储持续时间,因此它的生存期是封闭块的生存期,即使它将由于其地址未被获取而不可访问.
相比之下,它们会触发未定义的行为:
x = ++(int){++x};
x = (int){x++}++;
因为x
在没有序列点的情况下被多次修改,因为使用复合文字不会引入序列点.
第6.8p4节说明了以下内容(不是粗体部分):
full expression是一个不属于另一个表达式的表达式 表达式或用于声明者.以下每一项都是完整的 表情:an initializer that is not part of a compound literal; 表达式语句中的表达式;控制 Select 语句(
if
或switch
);一个while
或do
语句;for
的每个(可选)表达式 语句;return
语句中的(可选)表达式.有一个 完整表达式的求值和 要计算的下一个完整表达式的计算.
在上面的示例中,由于++x
是复合文字的初始值设定项的一部分,因此它不符合完整表达式的要求,因此不存在复合文字引入的序列点.