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

时间:2011-03-01 04:44:49

标签: c++ stack cout

我有一个自定义堆栈类。大部分代码都可以在这里看到:
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,这显然是我想要的。

那么,是什么给出了?

3 个答案:

答案 0 :(得分:7)

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

cout << a << b << c << d;

abcd均为对Astack.Pop()的调用。编译器可以生成以其选择的任何顺序评估这些调用的代码。

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

答案 1 :(得分:1)

在第一个版本中,cout的参数从右到左进行评估。你永远不会实际指定它们应该被评估的顺序,因此首先评估右边的那个,弹出4,依此类推。

答案 2 :(得分:1)

ISO C ++标准定义了一些称为未指定的行为。你的代码片段就是一个例子。