3

我有一个自定义堆栈类。大部分代码可以在这里看到:
模板类的成员函数,以模板类型作为参数

我像这样填充堆栈:

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,这显然是我想要的。

那么,什么给了?

4

3 回答 3

7

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

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

abc和中的每一个d都是对 的调用Astack.Pop()。编译器可以生成代码,以它选择的任何顺序评估这些调用。

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

于 2011-03-01T04:49:35.743 回答
1

在第一个版本中,参数cout是从右到左评估的。您实际上从未指定应该以哪个顺序评估它们,因此首先评估右侧的顺序,然后弹出 4,依此类推。

于 2011-03-01T04:48:50.043 回答
1

ISO C++ 标准定义了一种称为未指定行为的东西。您的代码片段只是其中的一个示例。

于 2011-03-01T04:49:19.270 回答