我有一个自定义堆栈类.这里可以看到大多数代码:
模板化类的成员函数,它将模板类型作为参数
我这样填充堆栈:
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,这显然是我想要的.
那么,是什么给出的?
函数调用的评估顺序未指定.你的第一个表达基本上归结为:
cout << a << b << c << d;
Run Code Online (Sandbox Code Playgroud)
每一个a,b,c,和d对通话Astack.Pop().编译器可以生成以其选择的任何顺序评估这些调用的代码.
您应该避免编写依赖于表达式部分的特定评估顺序的表达式.一般来说,它不安全(即使它是安全的,通常也很混乱).