运算符优先级

Fab*_*era 7 c++ operators

可能重复:
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;
}
Run Code Online (Sandbox Code Playgroud)

old*_*inb 4

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

\n\n

根据 Stroustrup 的《C++ 编程语言》第三版的\xc2\xa76.2.2 ...

\n\n
\n

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

\n
\n\n

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

\n\n
\n

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

\n
\n\n

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

\n

  • 该标准严格区分未指定的顺序(某种顺序,但我们不知道哪个顺序)和未定义的行为(*任何事情*都可能发生)。斯特鲁斯特鲁普在他的书中似乎不那么严格。 (3认同)
  • 你的引文来自哪里?我查看了 C++03、C++11、C90、C99 和 C11,但没有一个 6.2.2 包含该内容。顺便说一句,C++03 在 5/4 中说“除非另有说明,各个运算符的操作数和各个表达式的子表达式的求值顺序以及副作用发生的顺序都是 **未指定**”。(我使用的版本有 C++98 的更改标记,因此可能没有更改)。与 **未定义** 的区别在于,代码必须提供多个结果之一,并且可能不会开始从您的鼻子中启动一组守护进程。 (2认同)