【问题标题】:c++ cout strange behavior with a custom Stack classc++ cout 自定义 Stack 类的奇怪行为
【发布时间】:2011-07-06 06:03:02
【问题描述】:

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

那么,什么给了?

【问题讨论】:

    标签: c++ stack cout


    【解决方案1】:

    在第一个版本中,cout 的参数是从右到左计算的。你从来没有真正指定它们应该以哪个顺序进行评估,所以首先评估右边的那个,然后弹出 4,依此类推。

    【讨论】:

    • 但是您不能依赖该命令(或任何其他命令);请参阅@James 的回答。
    • @Jeremiah:我知道,只是说在这种情况下就是这样。
    • 本案就是这样;我想澄清一下,这样其他人就不会认为这就是总是发生的事情。
    【解决方案2】:

    ISO C++ 标准定义了一种称为未指定行为的东西。您的 code-sn-p 只是其中的一个示例。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-25
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多