【问题标题】:Very strange priority/precendence in C++ function [duplicate]C ++函数中非常奇怪的优先级/优先级[重复]
【发布时间】:2013-03-16 02:16:24
【问题描述】:

为什么下面会打印出“World Hello!”?

据我了解,根据运算符的优先级,这应该从左到右进行评估。但相反,它似乎是从右到左。这是为什么呢?

#include <iostream>

using namespace std;


char print() {
    cout << "World";
    return '!';
}

int main() {
    cout << "Hello " << print() << endl;
    return 0;
}

【问题讨论】:

  • 抱歉,链接错误。应该是Order of evaluation of operands
  • 抱歉,我还是新手。我不知道该主题与我的问题相关。
  • 你的理解是错误的。顺序是不确定的,即它可以是从左到右、从右到左,或者从中间向外曲折。
  • @Seb - 无需道歉,这很难。运算符优先级告诉我们应用运算符的顺序,但不告诉我们评估参数的顺序。允许编译器提前评估这些,并且没有特定的顺序。
  • @n.m.你的意思是未指定。在与标准不同的意义上使用“未定义”一词只会导致混淆和吹毛求疵。

标签: c++ operator-precedence


【解决方案1】:

我不认为该标准对 print() 被调用的确切时刻提供任何保证,以应用 &lt;&lt; 运算符。

在您的情况下,似乎首先调用 print(),然后评估 cout &lt;&lt; Hello,然后才评估 [result of the previous expression] &lt;&lt; [result of print()]。

【讨论】:

    【解决方案2】:

    这就变成了

    operator<<
    (
        operator<<
        (
            cout,
            "Hello"
        ),
        print()
    )
    .operator<<
    (
        endl
    );
    

    参数的求值顺序是unspecified,所以没有什么说最内层的operator&lt;&lt;必须在第二层operator&lt;&lt;的调用中在print()之前被求值.

    这样想:foo( f1(), f2() );。首先评估哪个,f1() 或 f2()?我们不知道。我们只知道两者都会在foo() 运行之前完成。

    从左到右的precedence 意味着它最终以我写的方式配对。

    稍后编辑:轻微的技术错误。接听电话endl 实际上是会员版本。不过对其他东西没有任何影响。

    【讨论】:

      【解决方案3】:

      这应该从左到右进行评估。

      确实如此。你可以从最后的! 看到它。 但是,最终的字符串由cout 在运算符被评估后打印。但是,在操作员评估期间,您正在打印World。然后会打印Hello!。因此,您会得到WorldHello!。

      正如其他人所写,即使它是你得到的结果(我可以验证它),它甚至可能是关于调用顺序的未定义行为,因为评估顺序是未指定的。

      @Bo 提供了一个指向 C++ 标准的非常好的链接:

      §5.2.2.8 - [...] The order of evaluation of function arguments is unspecified. [...]
      

      【讨论】:

        【解决方案4】:

        订单未定义。看看Order of evaluation。

        cout << i << i++; // Undefined behavior
        

        【讨论】:

        • 评估顺序是unspecified,这在技术上与undefined略有不同。而且也不同于你的例子。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        相关资源
        最近更新 更多