0

今日、ポストインクリメントとプリインクリメントに関する興味深いステートメントを見てきました。次のプログラムを検討してください-

#include <stdio.h>

int main(){
    int x, z;

    x = 5;
    z = x++ - 5; // increase the value of x after the statement completed.
    printf("%d\n", z); // So the value here is 0. Simple.

    x = 5;
    z = 5 - ++x; // increase the value of x before the statement completed.
    printf("%d\n", z); // So the value is -1.

    // But, for these lines below..

    x = 5;
    z = x++ - ++x; // **The interesting statement
    printf("%d\n", z); // It prints 0

    return 0;
}

その興味深い声明で実際に何が起こっているのでしょうか? ポストインクリメントは、ステートメントが完了した後に x の値を増やすことになっています。次に、そのステートメントの最初の xの値は 5 のままです。また、プレインクリメントの場合、2 番目の xの値は6 または 7 にする必要があります (不明)。

z に 0 の値を与えるのはなぜですか? 5 - 5でしたか、それとも6 - 6でしたか? 説明してください。

4

1 に答える 1

10

それは未定義の動作です。コンパイラは、何でも自由に実行できます。0 を返すことも、42 を返すことも、ハード ドライブを消去することも、鼻から悪魔を飛ばすこともできます。これらの動作はすべて、C および C++ 言語標準で許可されています。

于 2013-08-27T19:30:15.093 に答える