子表达式的评估顺序

时间:2014-06-04 07:58:32

标签: c operator-precedence

如果不保证子表达式的评估顺序,那为什么这是正确的?

int a = 1;
a = a + 1;

这里编译器可以先评估a然后评估a + 1,这样a可以是1或2 虽然这不是:

a = a++;

这里编译器可以先评估a,然后a++儿子a可以是1或2。

有什么区别?

2 个答案:

答案 0 :(得分:1)

这是未定义的行为。原因如下:

  

§5/ 4中的标准说

     

在前一个和下一个序列点之间,标量对象应该   通过评估a,最多修改一次存储值   表达

  

只能访问先前值以确定值   存储

这意味着,在两个序列点之间,变量不能被多次修改,如果一个对象被写入一个完整的表达式,那么在同一个表达式中对它的任何和所有访问都必须直接参与计算要写的价值。

答案 1 :(得分:0)

了解序列点here,基本上你在2个序列点之间有2个赋值,这将导致未定义的行为。

a++会增加a的值,然后将其分配给a,另一项任务将由=运算符完成,而a + 1不会更改a的值,您将在2个序列点之间只有1个分配