C++函数中非常奇怪的优先级/优先级
为什么下面打印出“World Hello!”?C++函数中非常奇怪的优先级/优先级
根据我的理解,根据运算符优先级,这应该从右边评估。但是,从左到右似乎是正确的。为什么是这样?
#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()]
被评估。
订单未定义。看看Order of evaluation。
cout << i << i++; // Undefined behavior
评估顺序*未指定*与技术上略有不同* undefined *。和你的例子不同。 – 2013-03-26 10:24:43
这应该是评估自右向左。
它的确如此。你可以从最后的!
看到它。 但是,最后的字符串是由cout
打印后操作员已被评估。但是,期间运营商评估,您正在打印World
。之后打印Hello!
。因此,你得到WorldHello!
。
与其他人一样,即使它是你得到的结果(并且我可以验证它),由于评估的顺序没有指定,它甚至可能与调用顺序有关的未定义行为。
@Bo鸣哨指向C++标准的一个很好的链接:
§5.2.2.8 - [...] The order of evaluation of function arguments is unspecified. [...]
这成为
operator<<
(
operator<<
(
cout,
"Hello"
),
print()
)
.operator<<
(
endl
);
evalutation的参数是unspecified的顺序,所以没有什么话说,最里面的operator<<
必须在调用第二个最里面operator<<
print()
之前评估。
想想像这样:foo(f1(), f2());
。哪一项将首先评估,f1()
或f2()
?我们不知道。我们只知道两者都会在foo()
运行之前完成。
从左到右precedence意味着它结束了我写它的方式。
更多后来编辑:轻微的技术错误。拨打电话endl
实际上是一个会员版本。虽然没有任何区别。
对不起,错误的链接。应该是[操作数的评估顺序](http://*.com/questions/7112282/order-of-evaluation-of-operands?lq=1) – 2013-03-26 10:22:03
我很抱歉,我还是这个新手。我不知道那个话题与我的问题有关。 – xyz 2013-03-26 10:22:13
你的理解是错误的。订单未定义,即可以从左到右,从右到左或从中间向外锯齿形。 – 2013-03-26 10:22:58