2012-02-16 17 views
0

可能性の重複:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)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; 
} 

アウトCコード印刷の次の作品私はp[i] == *(p + i)を知っていますが、その場合、p-表現またはi-発現がev最初にaluated。私がclanggccで得た結果から、i式が最初に評価されることがわかりましたが、私の教授は*(p + i)という評価順序はCで定義されていないと言っていますか?

質問:このプログラムの動作は、どの標準でも定義されているか、それともコンパイラに依存していますか?

+2

どうやらこの質問は1日に1回お願いします。 – Lundin

+0

@Lundin私はそれがより頻繁に起こったと言えるでしょう。 –

答えて

2

これは未定義の動作です:p++[*p++]です。

2つのシーケンスポイント間でオブジェクトを2回修正することは、Cでは未定義の動作です。未定義の動作とは、実装が実装することができれば、42を印刷できることを意味します。

参照:「オブジェクトが格納された値は、式の評価によって最も一度変更したものと前と次のシーケンスポイント間の」

(C99、6.5p2)

2

C規格では、この動作は、コンパイラが、それはすべての通常の容疑者(多数の創造のための例未定義の動作を検索)を含め、欲しいものは何でもできることを意味します未定義、であることを定義します。

2つのインクリメントの間にシーケンスポイントがないため、それらの式が評価される順番に制約はありません。多くの似たような例については、Armen linkedの質問を参照してください。

+0

私のgccが 'M-x hanoi' XDで私のemacsを開くのを見るのが大好きです – Eregrith

1

pは、シーケンスポイント間で複数回変更されるため、動作は定義されていません。