运算符优先级

时间:2012-08-23 06:37:25

标签: c++ operators

  

可能重复:
  cout << order of call to functions it prints?
  Undefined Behavior and Sequence Points

为什么此代码打印2 1 0?

#include <iostream>
struct A{
  int p;
  A():p(0){}
  int get(){
    return p++;
  }
};


int main(){
 A a;
 std::cout<<a.get()<<" "<<a.get()<<" "<<a.get()<<std::endl;
}

1 个答案:

答案 0 :(得分:4)

正如我在my comment中所述,没有序列点 ......

根据Stroustrup的 C ++编程语言§6.2.2,第三版 ......

  

表达式中子表达式的评估顺序未定义。特别是,您不能假设表达式是从左到右计算的。

§5.4的C ++ 03标准规定:

  

除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的。在前一个和下一个序列点之间,标量对象的表达式最多只能修改一次存储值。

您可以详细了解序列点和未定义的行为here