2013-03-26 214 views
1

爲什麼下面打印出「World Hello!」?C++函數中非常奇怪的優先級/優先級

根據我的理解,根據運算符優先級,這應該從右邊評估。但是,從左到右似乎是正確的。爲什麼是這樣?

#include <iostream> 

using namespace std; 


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

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

對不起,錯誤的鏈接。應該是[操作數的評估順序](http://stackoverflow.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

回答

6

我不認爲標準提供了有關的確切時刻任何保證當print()被稱爲關於<<的應用運營商。

在你的情況下,它看起來像print()被首先調用,然後cout << Hello被評估,並且只有[result of the previous expression] << [result of print()]被評估。

1

訂單未定義。看看Order of evaluation

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

評估順序*未指定*與技術上略有不同* undefined *。和你的例子不同。 – 2013-03-26 10:24:43

2

這應該是評估自右向左。

它的確如此。你可以從最後的!看到它。 但是,最後的字符串是由cout打印後操作員已被評估。但是,期間運營商評估,您正在打印World。之後打印Hello!。因此,你得到WorldHello!

與其他人一樣,即使它是你得到的結果(並且我可以驗證它),由於評估的順序沒有指定,它甚至可能與調用順序有關的未定義行爲。

@Bo鳴哨指向C++標準的一個很好的鏈接:

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

這成爲

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

evalutation的參數unspecified的順序,所以沒有什麼話說,最裏面的operator<<必須在調用第二個最裏面operator<<print()之前評估。

想想像這樣:foo(f1(), f2());。哪一項將首先評估,f1()f2()?我們不知道。我們只知道兩者都會在foo()運行之前完成。

從左到右precedence意味着它結束了我寫它的方式。

更多後來編輯:輕微的技術錯誤。撥打電話endl實際上是一個會員版本。雖然沒有任何區別。