0

重複の可能性:
未定義の動作とシーケンス ポイント

以下のコードを手作業で作成します。

#include <stdio.h>

int func (int a, int b) {
    static int c = 1;
    return a + b * (c *= -1);
}

int main () {
    int a = 2, b = 3;
    int c = func(a, b);

    a *= a++;
    b *= ++b;

    printf("%d %d %d %d\n", a, b, c, func(a, b));
}

printf()の変数を次のように計算します。

a = 5, b = 16, c = -1, func(a, b) = -11

ただし、私のコンパイラは、最後の値が実際には 21 であることを教えてくれます。

出力:

a = 5, b = 16, c = -1, func(a, b) = 21n

私は自分の価値を次のように計算します(16*-1) + 5

どこが間違っているのか誰か教えてもらえますか?

4

1 に答える 1

4
a *= a++;
b *= ++b;

どちらのステートメントも C では未定義の動作です。これらは C シーケンス ポイントの規則に違反しています。

a *= a++; 

次と同等です。

a = a * a++;

また、前のシーケンス ポイントと次のシーケンス ポイントの間でオブジェクトを 2 回変更することは、C では未定義の動作です (C99、6.5p2)。

于 2012-10-26T11:54:17.980 に答える