在标准C中,是否指定了表达式
i = (i = 1) + 1;
?
从序列点的角度来看,它和i = ++i + 1;
有什么区别?
有人告诉我
(i=1)
中i = (i = 1) + 1;
后面有一个序列点,所以指定了表达式,是吗?
表达式
i = (i = 1) + 1
包含 未定义行为,因为 i
在没有序列点的表达式中被多次修改(或者更准确地说,修改是无序的)。
此规则在 C 标准第 6.5p2 节中有详细说明:
如果标量对象的副作用相对于任一 对同一标量对象或值的不同副作用 使用同一标量对象的值进行计算,其行为是 不明确的。如果有多个允许的排序 表达式的子表达式,如果这样的话,行为是未定义的 任何顺序都会出现未排序的副作用。
两个赋值运算符都有更新的副作用
i
。子表达式 i = 1
周围的括号确实 not 引入了序列点,因此该表达式违反了上述子句。
出于同样的原因,
i = ++i + 1;
也包含未定义的行为。