C++ C+;中非常奇怪的优先级/优先级+;功能

C++ C+;中非常奇怪的优先级/优先级+;功能,c++,operator-precedence,C++,Operator Precedence,为什么下面打印出“世界你好!” 根据我的理解,根据运算符优先级,应该从左到右求值。但它似乎是从右到左再到右。为什么会这样 #include <iostream> using namespace std; char print() { cout << "World"; return '!'; } int main() { cout << "Hello " << print() << endl; re

为什么下面打印出“世界你好!”

根据我的理解,根据运算符优先级,应该从左到右求值。但它似乎是从右到左再到右。为什么会这样

#include <iostream>

using namespace std;


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

int main() {
    cout << "Hello " << print() << endl;
    return 0;
}
#包括
使用名称空间std;
字符打印(){

cout顺序未定义。请看


cout顺序未定义。请看

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

是的。你可以从最后的
看到它。 但是,在对操作符求值之后,
cout
将打印最后一个字符串。但是,在对操作符求值期间,您正在打印
World
。然后打印
Hello!
。因此,您将获得
worldhhello!

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

博城给出了一个很好的链接,指向C++标准:

§5.2.2.8 - [...] The order of evaluation of function arguments is unspecified. [...]
这应该从左到右进行评估

是的。你可以从最后的
看到它。 但是,在对操作符求值之后,
cout
将打印最后一个字符串。但是,在对操作符求值期间,您正在打印
World
。然后打印
Hello!
。因此,您将获得
worldhhello!

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

博城给出了一个很好的链接,指向C++标准:

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

我不认为标准就
应用程序调用
print()
的确切时刻提供了任何保证,我不认为标准就
应用程序调用
print()
的确切时刻提供了任何保证

operator<<
(
    operator<<
    (
        cout,
        "Hello"
    ),
    print()
)
.operator<<
(
    endl
);
运算符这将变为

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

运算符抱歉,链接错误。我应该道歉,我还是新手。我不知道该主题与我的问题相关。您的理解是错误的。顺序未定义,即可以是从左到右、从右到左或从中间向外曲折。@Seb-无需道歉,这很难。运算符ls us运算符的应用顺序,而不是参数的求值顺序。允许编译器提前求值,并且不按特定顺序求值。@n.m.您的意思是未指定。使用“未定义”一词与标准不同的是,它只会引起混乱和挑剔。对不起,链接错误。我应该道歉,我对这一点还是新手。我不知道这个主题与我的问题有关。你的理解是错误的。顺序是未定义的,即可以是从左到右、从右到左或从中间向外曲折。@Seb-否需要道歉,这很难。运算符优先级告诉我们运算符的应用顺序,而不是参数的求值顺序。编译器可以提前求值,并且没有特定的顺序。@n.m.您的意思是未指定。使用“未定义”一词与标准不同的是,只会引起混淆和吹毛求疵。评估顺序未指定,在技术上与未定义的略有不同。也不同于您的示例。评估顺序未指定,在技术上与未定义的略有不同。也不同于您的示例。