为什么下面会打印出“World Hello!”?
据我了解,根据运算符优先级,这应该从左到右进行评估。但相反,它似乎是从右到左。为什么是这样?
#include <iostream>
using namespace std;
char print() {
cout << "World";
return '!';
}
int main() {
cout << "Hello " << print() << endl;
return 0;
}
为什么下面会打印出“World Hello!”?
据我了解,根据运算符优先级,这应该从左到右进行评估。但相反,它似乎是从右到左。为什么是这样?
#include <iostream>
using namespace std;
char print() {
cout << "World";
return '!';
}
int main() {
cout << "Hello " << print() << endl;
return 0;
}
我不认为该标准print()
就操作员的应用程序调用的确切时间提供任何保证<<
。
在您的情况下,它看起来像print()
首先被调用,然后cout << Hello
被评估,然后才被[result of the previous expression] << [result of print()]
评估。
这变成
operator<<
(
operator<<
(
cout,
"Hello"
),
print()
)
.operator<<
(
endl
);
参数的评估顺序是未指定的,所以没有什么说在调用 second-innermostoperator<<
之前必须先评估最内层。print()
operator<<
这样想:foo( f1(), f2() );
。哪个将首先被评估,f1()
还是f2()
?我们不知道。我们只知道两者都将在foo()
运行前完成。
从左到右的优先级意味着它最终以我写它的方式配对。
很久以后编辑:轻微的技术错误。接听电话endl
实际上是会员版本。但是对其他任何东西都没有任何影响。
这应该从左到右进行评估。
确实如此。你可以从!
最后看到它。但是,最终的字符串是在对运算符进行评估cout
之后打印的。但是,在操作员评估期间,您正在打印World
. 然后Hello!
打印。因此,你得到WorldHello!
.
正如其他人所写的那样,即使它是你得到的结果(我可以验证它),它甚至可能是关于调用顺序的未定义行为,因为评估的顺序是未指定的。
@Bo 提供了一个非常好的指向 C++ 标准的链接:
§5.2.2.8 - [...] The order of evaluation of function arguments is unspecified. [...]
订单未定义。看评价顺序。
cout << i << i++; // Undefined behavior