2015-06-06 76 views
-1

這裏有什麼區別? 我認爲這兩個版本應該是平等的,但顯然他們不是。 你能解釋第一個是如何工作的嗎?爲什麼它打印222而不是122?cout如何工作? (C++)

#include <iostream> 
using namespace std; 

int main() { 
    int a = 1; 
    /* #1: prints 222 
    cout << a << (a = 2) << a << endl; 
    */ 

    /* #2: prints 122 
    cout << a; 
    cout << (a = 2); 
    cout << a << endl; 
    */ 
    return 0; 
} 
+1

閱讀順序點。 –

+0

您正在將'a'分配給2來修改該值。 ostream在輸出之前評估這些值。 – Poriferous

+0

@Poriferous是對的。讓我再解釋一下。編譯器將讀取每行並修改值,然後它將與結果一起工作。在你的代碼編譯器中讀取一行<<(a = 2)<< a;這裏是編譯器讀取行,並且您正在更改值a = 2,則完整行中沒有任何更改。之後編譯器將打印結果。所以a被修改爲2?那麼結果將是222。 – UnKnown

回答

0

據我知道你不能保證在訂購<<表達的子表達式的結果。在第一個版本中,編譯器決定在第一個輸出之前執行分配。

然而,第二個版本使操作順序顯式化。分號表明打印操作應在分配操作之前進行。

這與評估例如二元運營商,由於短路副作用的順序是從左到右。