1

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

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

#include <iostream>

using namespace std;


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

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

4 回答 4

6

我不认为该标准print()就操作员的应用程序调用的确切时间提供任何保证<<

在您的情况下,它看起来像print()首先被调用,然后cout << Hello被评估,然后才被[result of the previous expression] << [result of print()]评估。

于 2013-03-26T10:21:02.823 回答
4

这变成

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

参数的评估顺序是指定,所以没有什么说在调用 second-innermostoperator<<之前必须先评估最内层。print()operator<<

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

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

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

于 2013-03-26T10:22:41.297 回答
2

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

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

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

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

§5.2.2.8 - [...] The order of evaluation of function arguments is unspecified. [...]
于 2013-03-26T10:20:52.247 回答
1

订单未定义。看评价顺序

cout << i << i++; // Undefined behavior
于 2013-03-26T10:20:16.463 回答