2012-02-16 72 views
0

可能重複:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)C-指針遞增邊緣情況和評價順序

下面片C-代碼打印出0和1。

#include <stdio.h> 

int main(void) { 
    int array[] = {3,2,1,0}; 
    int *p = array; 

    printf("%d\n", p++[*p++]); 
    printf("%d\n", *p); 

    return 0; 
} 

我知道p[i] == *(p + i),但在這種情況下,如果p表達式或i表達式是ev首先受騙。從我用clanggcc得到的結果中,我看到i表達式首先被評估,但是我的教授說*(p + i)的評估順序沒有在C中定義?

問題:這個程序的行爲是由任何標準定義還是依賴於編譯器?

+2

顯然這個問題每天都會被問到一次... – Lundin 2012-02-16 14:59:44

+0

@Lundin我可以發誓它更頻繁。 – 2012-02-16 15:35:10

回答

2

這是未定義的行爲:p++[*p++]

在兩個序列點之間修改對象兩次是C中未定義的行爲。未定義的行爲意味着如果需要,實現可以打印42

參見:「之間的一個和下一個順序點的對象應具有其存儲的值由表達式的評估在改性最多一次」

(C99,6.5p2)

2

C標準定義這種行爲是不確定,這意味着編譯器可以爲所欲爲,包括所有常見的犯罪嫌疑人(搜索衆多創意的例子未定義行爲)。

這兩個增量之間沒有順序點,因此對這些表達式的評估順序沒有約束。請參閱Armen的鏈接以討論許多類似的例子。

+0

我希望看到我的gcc在'M-x hanoi' XD上打開我的emacs – Eregrith 2012-02-16 15:04:48

1

您在一個序列點之間不止一次地更改p,所以行爲是未定義的。