7

可能重复:
cout << 调用它打印的函数的顺序?
未定义的行为和序列点

为什么此代码打印 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;
}
4

1 回答 1

4

正如我在评论中所说,没有序列点......

根据 Stroustrup 的The C++ Programming Language, Third Edition的§6.2.2 ...

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

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

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

您可以在此处了解有关序列点和未定义行为的更多信息。

于 2012-08-23T06:43:34.727 回答