我正在寻找对强调行的澄清。


(C99 6.5.16 / 3)赋值运算符将值存储在对象中
由左操作数指定。赋值表达式具有值
赋值后的左操作数的整数,但不是左值。的
赋值表达式的类型是左操作数的类型
除非左操作数具有限定类型,否则为
左操作数类型的非限定版本。副作用
更新左操作数的存储值应发生在
上一个和下一个序列点。


考虑以下示例:

int x = 42;
int y = 0;

int main()
{
   // side effect of modifying 'x'
   x = y;
}


上一个和下一个序列点是什么? main的开头是否有一个顺序点?

最佳答案

C99 5.1.2.3将序列点定义为发生先前评估的所有副作用且尚未开始进行后续评估的副作用的位置。该标准的附录C定义了顺序点的位置:函数调用,逻辑运算符的结尾,逗号运算符和三元运算符,完整声明的结尾,完整表达式的结尾,等等。

在这种情况下,前一个序列点是main()的开始,而下一个序列点是赋值末尾的分号。在第一个序列点,x的值为42,在第二个序列点的值为0。

10-08 02:40