操作数的评估顺序

在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序列点时遵循相同的逻辑:

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

对于C语言:“操作顺序不是由语言定义的,如果编译器能保证一致的结果,编译器可以自由地评估这些expression式的顺序。” […]“只有顺序评估(,),逻辑与(&&),逻辑OR(||),条件expression式(?:)和函数调用操作符构成了顺序点,因此保证特定的操作数评估顺序“。

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

这篇文章的组织方式,似乎也表明这也适用于C ++,这个问题的答案证实了这一点: 运算符优先级与评估顺序 。

根据目前的C标准 C11,它还规定了子expression式(在这种情况下, ab )的评估顺序是不确定的。 事实上,如果多次评估同一个expression式,这个顺序甚至不一定是相同的。

从6.5节:

语法表示运算符和操作数的分组。 除了后面的规定, 子expression式的副作用和值计算是不确定的。 86)


86)在一个程序执行过程中被多次评估的expression式中,对其子expression式的无序和不确定的评估不需要在不同的评估中一致地执行。