0

私はCで小さなコードを持っています

#include<stdio.h>
int main()
{
    int a=10,b;
    b=a++ + ++a;
    printf("%d,%d,%d,%d",b,a++,a,++a);
    return 0;
}

Turbo Cは次の出力を提供します(予想どおり)

22,13,13,13

しかし、GCC(Windowsでubuntuとコードブロックコンパイラを使用)は以下を提供します

22,13,14,14

Turbo c の出力は正しいと思いますが、なぜ GCC が異なる出力を返すのでしょうか?

4

2 に答える 2

4

どちらも正しいです!1 回の呼び出しで同じ値を複数回変更することは許可されていないため、これは未定義の動作です。

c99 ISO/IEC 9899:TC3 から -> Apenndix J:

J.2 未定義の動作 1 次の状況では、動作は未定義です。

[...]

— 2 つのシーケンス ポイントの間で、オブジェクトが 2 回以上変更されるか、または変更されて、保存する値を決定する以外の目的で以前の値が読み取られる (6.5)。

編集:

ターボcはc99より前にあると語ったアイスパックのコメントを参照して、私はからの引用も追加しました

C89 標準プログラミング言語 C、X3.???-1988:

A.6.2 未定義の動作 次の状況での動作は未定義です。

[..]

  • 2 つのシーケンス ポイント (3.3) の間で、オブジェクトが複数回変更されるか、新しい値を決定する以外の目的で変更およびアクセスされます。
于 2013-09-14T14:37:57.103 に答える
2

これは未定義の動作です。C と同様に、関数の引数評価の指定がないため、コンパイラは自由にそれを行うことができます。それは未定義で任意です。

C99 標準 6.5.:-

前のシーケンス ポイントと次のシーケンス ポイントの間で、オブジェクトの格納値は、式の評価によって最大 1 回変更されます。さらに、以前の値は、保存する値を決定するためにのみ読み取られます。

于 2013-09-14T14:36:26.687 に答える