2013-10-25 85 views
4

我對這個問題感到非常愚蠢。但無法自行找出原因。這是如何評估?

int main() 
{ 
    int target; 
    int buffer =10; 
    const int source = 15; 
    target = (buffer+=source) = 20; 
    cout << target+buffer; 
    return 0; 
} 

target = (buffer+=source) = 20;將成爲target = (25) = 20

但是,如果我在我的源文件中給出相同的語句,它會給出l值錯誤。

如何的target+buffer值被印刷40.

+1

通過調試程序進行調試可以幫助您。 – benjymous

+3

你不是[試圖用C編譯器編譯](http://stackoverflow.com/a/106540​​19/335858),是嗎? – dasblinkenlight

+3

我很確定這是由於排序而導致的未定義行爲。 – Bathsheba

回答

5

某些預定義運算符,如+ =,當施加到基本類型[§13.5/ 7]

需要一個操作數是一個 左值

buffer+=source返回一個左值對buffer的引用。 所以你沒有編譯錯誤。

您的發言可以被作爲評估:

buffer+=source; 
buffer=20; 
target=20; 

但在一份聲明中修改buffer兩次是未定義行爲和其他編譯器能得到別的東西作爲結果。 (不確定在這種情況下!)

+0

@jrok:謝謝,我一開始沒有注意到。編輯。 – deepmax

+1

不要太感謝我,我真的不知道了。 :) *「在所有情況下,賦值都是在計算右邊和左邊的操作數之後,賦值表達式的值計算之前進行排序的。*我很確定它在C++ 03中是未定義的,但是這個引用來自C++ 11. – jrok

+0

@jrok:所以你可以在SO中提出一個很好的問題,你有我的+1 :-) – deepmax