-3

次のコードを実行しました。


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 では、評価順序は右から左です。それは...ですか?

4

1 に答える 1

5

私の期待の何が間違っていますか?

関数パラメータの評価順序は指定されていません - それは実装に任されています。さらに、パラメーター間にシーケンス ポイント*がないため、シーケンス ポイントの前に変更されたパラメーターを再度使用すると、予測可能な結果が得られません。これは未定義の動作です (基準への参照を提供してくれた Eric に感謝します)。

特定の評価順序が必要な場合は、パラメーターを完全な式として評価する必要があります (これにより、各パラメーターの間にシーケンス ポイントが強制されます)。

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);


*シーケンス ポイントは、前に適用されたすべての式の増分または減分などの副作用を期待できる、コード内の場所の凝った名前です。

于 2013-07-28T11:02:01.983 に答える