C中的关系运算符是否有固定的评估顺序?

时间:2017-01-07 12:54:35

标签: c evaluation

问题在于:

  

使用int a,b,c;a = a * b + a;相对于(c = a * b)!=(a = c + a);的修改等同于a

乍一看,我认为它们是相同的,但是规范说在expr1 != expr2中,expr1始终会在expr2之前进行评估吗?我认为情况并非如此,但我无法找到明确的消息来源。

另外,我对http://en.cppreference.com/w/c/language/eval_order中的内容感到困惑:

  

直接赋值运算符和所有复合赋值运算符的副作用(左参数的修改)在左右参数的值计算(但不是副作用)之后排序。

     

(自C11起)

这是否意味着我可以将其解释为自C11以来上述陈述将具有固定的评估顺序(因为涉及分配),但不是在C11之前?

1 个答案:

答案 0 :(得分:2)

(c = a * b)!=(a = c + a);调用未定义的行为。表达式(c = a * b)(a = c + a)的评估顺序未按顺序排列。

C11-6.5 / 2:

  

如果对标量对象的副作用相对于同一标量对象的不同副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义。[...]

报价

  

直接赋值运算符和所有复合赋值运算符的副作用(左参数的修改)在左右参数的值计算(但不是副作用)之后排序。

表示对于a = b;a += b这样的表达式,在评估子表达式b和{{}之后,会对aa的分配进行排序1}}在两个陈述中。这是由C标准保证的。但是,不保证上述声明中对ba的评估顺序。