赋值运算符和带序列点的副作用

时间:2012-12-28 12:22:51

标签: c c99 conditional-operator

我正在寻找一些关于强调线的澄清。

  

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

考虑以下示例:

int x = 42;
int y = 0;

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

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

3 个答案:

答案 0 :(得分:3)

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

在这种情况下,前一个序列点是main()的开头,下一个序列点是赋值结束时的分号。在第一个序列点,x的值为42,第二个序列的值为0.

答案 1 :(得分:0)

以下是C FAQ的序列点的解释。

在这种情况下,序列点就在完整表达式x = y;之前和之后。

答案 2 :(得分:0)

只是添加到user4815162342的答案,评论太长了。语句按顺序排列:

  

语句指定要执行的操作。除非另有说明,   语句按顺序执行。

因此,根据经验,每个;都有一个序列点,但标准中没有明确提及它们。