2013-07-28 68 views
-3

我執行下面的代碼。增量操作的評估順序在c


int main(void) 
{ 
    int c; 
    c=0; 
    printf("%d..%d..%d \n", c,c,c); 
    c=0; 
    printf("%d..%d..%d \n", c,c,c++); 
    c=0; 
    printf("%d..%d..%d \n", c,c++,c); 
    c=0; 
    printf("%d..%d..%d \n", c++,c,c);

return 0;}

我所期望的輸出

0..0..0

1..1..0

0..1..0

0..0..0

但是(編譯GCC)的輸出是

0..0..0

1..1..0

1..0..1

0 1..1

我的期望有什麼問題? 在gcc中,評估順序是從右到左。是嗎?

+0

如果你增加了所有增量,會發生什麼?它打印3,2,1? –

+0

它將是2 1 0 – Shihab

+0

我會將此標記爲重複項,除非我發現的重複項比C 2011標準更舊,並且我們應該爲新標準更新答案。涉及C 2011標準的這個主題還有另一個問題嗎? –

回答

5

我的期望有什麼問題?

函數參數的評估順序未指定 - 它由實現決定。此外,在參數之間沒有sequence point*,所以在序列點之前再次使用修改後的參數不能給出可預測的結果:它是未定義的行爲(thanks, Eric, for providing a reference to the standard)。

如果你想要一個特定的計算順序,你需要評估你的參數完全表達式(迫使他們每個人之間的序列點):

int arg1 = c++; 
int arg2 = c; 
int arg3 = c; 
// This: printf("%d..%d..%d \n", c++,c,c); 
// Becomes this: 
printf("%d..%d..%d \n", arg1, arg2, arg3); 


*序列點是看中名稱代碼之後的地方,您可以指望應用的所有前面的表達式的副作用(例如增量或減量)。

+0

如何指定函數的評估順序? – Shihab

+0

@Shihab您可以通過分別評估每個參數來強制執行評估順序。 – dasblinkenlight

+2

這不僅僅是一個不明確的評估順序問題。 C標準沒有定義整個行爲,而不僅僅是評估參數的順序。根據C 2011(N1570)6.5 2:「如果標量對象的副作用不是相對於同一標量對象的不同副作用或使用相同標量對象的值進行值計算,則行爲不確定。 「 –