[c++11]Sequenced before 规则和求值顺序

任何 C++ 操作符的求值顺序都是 unspecified(后面提到的除外),unspecified 也就是标准没有指定,可以由编译器决定,这包括在函数调用表达式中函数参数的求值顺序以及任何表达式的子表达式的求值顺序。编译器可以按照任意顺序将它们求值,对于相同的表达式,编译器也可以选择不同的顺序将它们求值。

在 C++ 中,没有什么从左到右或者从右到左的求值顺序,只有操作符从左到右和从右到左的结合性。就比如说表达式f1() + f2() + f3() 会通过加法操作符从左到右的结合性被解析为 (f1() + f2()) + f3(),但是对 f3 的调用可能会最先执行,然后是 f1,最后是 f2,因为它们的求值顺序是 unspecified。

C++ 是一个注重效率的语言,标准不指定一些表达式的求值顺序就是为了让编译器能做尽可能多的优化,即便要牺牲掉例如 i=i++ 这样表达式的正确性(据说在 Java 中就没这些问题,这个表达式的结果是确定的)。

(more…)

Read More