我有一个自定义堆栈类。大部分代码都可以在这里看到:
Member functions of a templated class, that take a template type as argument
我像这样填充堆栈:
stack <int> Astack;
Astack.Push(1); Astack.Push(2); Astack.Push(3); Astack.Push(4);
然后我这样做:
cout << Astack.Pop() << Astack.Pop() << Astack.Pop() << Astack.Pop() <<endl;
得到这个:1234
但是,如果我这样做:
cout << Astack.Pop(); cout << Astack.Pop(); cout << Astack.Pop(); cout << Astack.Pop();
我明白了:4321,这显然是我想要的。
那么,是什么给出了?
答案 0 :(得分:7)
未指定函数调用的评估顺序。你的第一个表达基本上归结为:
cout << a << b << c << d;
a
,b
,c
和d
均为对Astack.Pop()
的调用。编译器可以生成以其选择的任何顺序评估这些调用的代码。
您应该避免编写依赖于表达式部分的特定评估顺序的表达式。一般来说,它不安全(即使它是安全的,通常也很混乱)。
答案 1 :(得分:1)
在第一个版本中,cout
的参数从右到左进行评估。你永远不会实际指定它们应该被评估的顺序,因此首先评估右边的那个,弹出4,依此类推。
答案 2 :(得分:1)
ISO C ++标准定义了一些称为未指定的行为。你的代码片段就是一个例子。