操作数的评估顺序
在expression式a + b
,保证在b
之前被评估,还是未指定评估的顺序? 我认为这是后者,但我很难在标准中find明确的答案。
由于我不知道C是否处理了与C ++不同的问题,或者如果在C ++ 11中简化了评估顺序规则,我将把问题标记为三个。
在C ++中,对于用户定义的types, a + b
是一个函数调用,标准说:
§5.2.2.8 – […]函数参数的评估顺序是未指定的 。 […]
对于正常的运营商,标准说:
§5.4 – 除非另有说明,否则对个别操作符的操作数和个别expression式的子expression式的评估顺序以及副作用发生的顺序是未指定的 。 […]
这些在C ++ 11中没有改变。 然而,第二句的措辞改变是说顺序是“不确定的”,而不是没有说明的,但实质上是一样的。
我没有C标准的副本,但是我想也是一样的。
它是未指定的 。
参考 – C ++ 03标准:
第5节:expression式,第4段:
除非特别注明[例如&&和||的特殊规则],个别操作符的操作数的评估顺序和个别expression式的子expression式以及副作用发生的顺序是未指定的 。
C ++ 0x FDIS第1.9节“程序执行”§15类似于C ++ 03中的相应段落,只是为了适应从“序列点”到“正在sorting”的概念变化而重新进行了修改:
除了注意到的地方之外,对个别操作符和个别expression式的操作数的评估是不确定的。
这是不明确的。 C和C ++在select序列点时遵循相同的逻辑:
对于C语言:“操作顺序不是由语言定义的,如果编译器能保证一致的结果,编译器可以自由地评估这些expression式的顺序。” […]“只有顺序评估(,),逻辑与(&&),逻辑OR(||),条件expression式(?:)和函数调用操作符构成了顺序点,因此保证特定的操作数评估顺序“。
资料来源: http : //msdn.microsoft.com/en-us/library/2bxt6kc4.aspx
这篇文章的组织方式,似乎也表明这也适用于C ++,这个问题的答案证实了这一点: 运算符优先级与评估顺序 。
根据目前的C标准 C11,它还规定了子expression式(在这种情况下, a
和b
)的评估顺序是不确定的。 事实上,如果多次评估同一个expression式,这个顺序甚至不一定是相同的。
从6.5节:
语法表示运算符和操作数的分组。 除了后面的规定, 子expression式的副作用和值计算是不确定的。 86)
86)在一个程序执行过程中被多次评估的expression式中,对其子expression式的无序和不确定的评估不需要在不同的评估中一致地执行。