c ++使用自定义Stack类的cout奇怪行为

Mat*_*son 3 c++ stack cout

我有一个自定义堆栈类.这里可以看到大多数代码:
模板化类的成员函数,它将模板类型作为参数

我这样填充堆栈:

stack <int> Astack;
Astack.Push(1); Astack.Push(2); Astack.Push(3); Astack.Push(4);
Run Code Online (Sandbox Code Playgroud)

然后我这样做:

cout << Astack.Pop() << Astack.Pop() << Astack.Pop() << Astack.Pop() <<endl;
Run Code Online (Sandbox Code Playgroud)

得到这个:1234
然而,如果我这样做:

cout << Astack.Pop(); cout << Astack.Pop(); cout << Astack.Pop(); cout << Astack.Pop();
Run Code Online (Sandbox Code Playgroud)

我明白了:4321,这显然是我想要的.

那么,是什么给出的?

Jam*_*lis 7

函数调用的评估顺序未指定.你的第一个表达基本上归结为:

cout << a << b << c << d;
Run Code Online (Sandbox Code Playgroud)

每一个a,b,c,和d对通话Astack.Pop().编译器可以生成以其选择的任何顺序评估这些调用的代码.

您应该避免编写依赖于表达式部分的特定评估顺序的表达式.一般来说,它不安全(即使它是安全的,通常也很混乱).