2014-03-01 99 views
-1

已知x靠左執行每條語句之前初始化爲0,結果在右邊顯示的值:c如何評估包含前綴增量的表達式?

(++x + ++x) + ++x == 7 
++x + (++x + ++x) == 9 
++x + ++x + ++x == 7 

爲什麼第一個語句的結果在7和第二語句結果在9? ??

爲什麼第一條語句的結果與第三條語句相同???

+6

我聞到未定義的行爲。 –

+0

參見例如http://stackoverflow.com/questions/949433/why-are-these-constructs-undefined-behavior?lq=1和谷歌'序列點' – abligh

回答

3

那麼它是未定義的行爲......編譯器很可能會編寫看起來像這樣的代碼。

(++x + ++x) + ++x == 7 
x = 0 
x++ => 1 (x) 
x++ => 2 (x) 
r = 2 + 2 
x++ => 3 (x) 
r + x = 7 

++x + (++x + ++x) == 9 

x++ => 1 x + (++x + ++x) 
x++ => 2 x + (x + ++x) 
x++ => 3 x + (x + x) 
//You'll have x + (x + x) where x is 3 
// Now 
r = 3 + 3 
x + r = 9 

Annnd這一切的有效期爲您目前使用的編譯器。其他編譯器可以足夠聰明,可以返回某些沒有的結果。它甚至可能取決於優化的水平,而這一切都可以歸結爲未定義的行爲。

總之,不要編寫看起來像這樣的代碼。我很確定你的編譯器正在輸出關於這個的一些警告。

爲了更多地解釋它發生的是你正在修改一個寄存器。在它可以執行操作之前,它必須評估「++」。所以你可能會認爲你最終得到:

1 + 2 + 3 => 5 

但實際上,因爲++不應該分配新的內存,它會增加適當的值。從左到右的順序可能會被強制使用括號。因此,在一種情況下,當它將總和r + x和帶括號的版本從左到右強制每個++然後總和x + r時,它將增加2次然後是第三次。但是因爲它是未定義的行爲。這並不意味着什麼。只是不要那樣做。

+0

您可能想添加**什麼**挑起未定義的行爲。 – alk

+0

@alk我試了一下 –

+0

評價結果似乎與我不一致......我認爲如果第二次評估開始時用括號內的第一個「++ x」代替,那麼它會更有意義。 – ThoAppelsin