操作数的评估顺序

时间:2011-08-18 18:28:18

标签: c++ c c++11 expression operator-precedence

在表达式a + b中,a保证在b之前进行评估,还是未指定评估顺序?我认为这是后者,但我很难在标准中找到明确的答案。

由于我不知道C是否处理与C ++有所不同,或者如果在C ++ 11中简化了评估顺序规则,我将把这个问题标记为三个。

6 个答案:

答案 0 :(得分:11)

未指定

参考 - C ++ 03标准:

第5节:表达式,第4段:

  除非另有说明,否则

&& amp;的特殊规则和||],单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定

答案 1 :(得分:11)

在C ++中,对于用户定义的类型a + b是一个函数调用,标准说:

  
    

§5.2.2.8 - [...]函数参数的评估顺序是未指定。 [...]

  

对于普通运营商,标准说:

  
    

§5.4 - 除非另有说明,否则单个运算符的操作数和各个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定。 [...]

  

C ++ 11没有改变这些。但是,第二个中的措辞改变,说订单是“ unsequenced ”而不是未指定,但它基本上是相同的。

我没有C标准的副本,但我想它也是一样的。

答案 2 :(得分:1)

未指明。 C和C ++在选择序列点时遵循相同的逻辑:

https://en.wikipedia.org/wiki/Sequence_point

答案 3 :(得分:1)

C ++ 0x FDIS第1.9节“程序执行”§15类似于C ++ 03中的相应段落,只是为了适应从“序列点”到“被排序”的概念变化而改写:

  

除非另有说明,否则对单个操作符的操作数和单个表达式的子表达式的评估是不合理的。

答案 4 :(得分:0)

对于C:“操作顺序不是由语言定义的。如果编译器可以保证一致的结果,编译器可以以任何顺序自由地评估这些表达式。” [...]“只有顺序评估(,),逻辑 - 和(&&),逻辑 - 或(||),条件 - 表达式(?:)和函数调用运算符构成序列点和因此,保证对其操作数的特定评估顺序。“

来源:http://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx

这篇文章的组织方式似乎表明这也适用于C ++,这个问题的答案证实了这一点:Operator Precedence vs Order of Evaluation

答案 5 :(得分:0)

根据当前的C standard,C11,它还指定子表达式(在这种情况下为ab)的评估顺序是不确定的。事实上,如果多次评估相同的表达式,这个顺序甚至不必相同。

从第6.5节开始:

  

运算符和操作数的分组由表示   语法。 85)除了后面指出的,副作用和   子表达式的值计算未被排序。 86)

           

86)在一个表达式中,在表达式中被多次评估   执行一个程序,无序和不确定的顺序   不需要对其子表达式进行评估   始终如一地进行不同的评估。