在标准C中,是表达式“i = (i = 1) + 1;”定义清楚吗?

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

标准C中,表达式

i = (i = 1) + 1;
定义良好吗? 从序列点的角度来看,它和
i = ++i + 1;
有什么区别

有人告诉我

(i=1)
i = (i = 1) + 1;
之后有一个序列点,所以表达式定义良好
,是吗?

c gcc clang language-lawyer llvm
1个回答
1
投票

表达式

i = (i = 1) + 1
包含 未定义行为,因为
i
在没有序列点的表达式中被多次修改(或者更准确地说,修改是无序的)。

此规则在 C 标准第 6.5p2 节中有详细说明

如果标量对象的副作用相对于任一 对同一标量对象或值的不同副作用 使用同一标量对象的值进行计算,其行为是 不明确的。如果有多个允许的排序 表达式的子表达式,如果这样的话,行为是未定义的 任何顺序都会出现未排序的副作用。

两个赋值运算符都有更新的副作用

i
。子表达式
i = 1
周围的括号确实 not 引入了序列点,因此该表达式违反了上述子句。

出于同样的原因,

i = ++i + 1;
也包含未定义的行为。

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