C++函数中非常奇怪的优先级/优先级

问题描述:

为什么下面打印出“World Hello!”?C++函数中非常奇怪的优先级/优先级

根据我的理解,根据运算符优先级,这应该从右边评估。但是,从左到右似乎是正确的。为什么是这样?

#include <iostream> 

using namespace std; 


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

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

对不起,错误的链接。应该是[操作数的评估顺序](http://*.com/questions/7112282/order-of-evaluation-of-operands?lq=1) – 2013-03-26 10:22:03

+0

我很抱歉,我还是这个新手。我不知道那个话题与我的问题有关。 – xyz 2013-03-26 10:22:13

+1

你的理解是错误的。订单未定义,即可以从左到右,从右到左或从中间向外锯齿形。 – 2013-03-26 10:22:58

我不认为标准提供了有关的确切时刻任何保证当print()被称为关于<<的应用运营商。

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

订单未定义。看看Order of evaluation

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

评估顺序*未指定*与技术上略有不同* 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实际上是一个会员版本。虽然没有任何区别。