这些表达式有定义吗?
int x = 5, y;
y = ++(int){++x};
//or
y = (int){x++}++;
并且(我找不到任何不被定义的理由)
int x = 5;
x = ++(int){++x};
//or
x = (int){x++}++;
IMO 有明确的序列点来创建新对象(复合文字)。
这些表达式有定义吗?
int x = 5, y;
y = ++(int){++x};
//or
y = (int){x++}++;
并且(我找不到任何不被定义的理由)
int x = 5;
x = ++(int){++x};
//or
x = (int){x++}++;
IMO 有明确的序列点来创建新对象(复合文字)。
这些都很好:
由于没有对象被读取或写入超过一次,特别是
x
,y
, 和未命名的复合文字。修改复合文字也不是问题,因为(在这种情况下)它具有自动存储持续时间,因此它的生命周期是封闭块的生命周期,即使它由于未获取地址而无法访问。相反,这些会触发未定义的行为:
因为
x
在没有序列点的情况下多次修改,所以使用复合文字不会引入序列点。C 标准第 6.8p4 节规定了以下内容(不是粗体部分):
在上面的示例中,由于
++x
是复合文字初始化程序的一部分,因此它不符合完整表达式的条件,因此复合文字没有引入序列点。