1

これは初心者の質問です。

以下は、私が使用していたC++コードです

int main() {
    int x=5, y=5;
    cout<<x--;
    cout<<",";
    cout<<--x;
    cout<<",";
    cout<<y--<<","<<--y;
    return 0;
}

Turbo C++ 3.0 で実行すると、コードによって次のような出力が表示されます。

5,3,4,4

Windows で Code::Blocks を使用してコンパイルすると (GCC/G++ で MinGW を使用)、次の出力が表示されます。

5,3,4,3

以前、特定の問題に対してコンパイラによって動作が異なる場合があると聞いたことがありますが、この結果が表示される理由がわかりません。論理的には、私が思うに、出力は次のようになるはずです。

5,3,5,3

そのような出力の論理的な理由を教えてください。

ありがとうございました!

4

2 に答える 2

3

正しい出力も間違った出力もありません。あなたのコードには未定義の動作があり、何でも可能です。

その理由は、C ++標準の段落1.9.15(n3337)にあります(強調鉱山):

特に明記されていない限り、個々の演算子のオペランドおよび個々の式の部分式の評価は順不同です。[注: プログラムの実行中に 2 回以上評価される式では、その部分式の順序付けされていない評価と不定に順序付けられた評価は、異なる評価で一貫して実行される必要はありません。—終わりの注] 演算子のオペランドの値の計算は、演算子の結果の値の計算の前に並べられます。スカラー オブジェクトに対する副作用が、同じスカラー オブジェクトに対する別の副作用または同じスカラー オブジェクトの値を使用した値の計算と比較して順序付けされていない場合、動作は未定義です。

この行で

cout << y-- << "," << --y;

スカラー オブジェクト ( ) に2 つの副作用 (接尾辞と接頭辞によるインクリメント) と 2 つの値の計算 (y--との結果) が導入されました。したがって、あなたのプログラムは形式が正しくなく、ほぼすべてが出力される可能性があります。--yy

詳細については、こちらをご覧ください。

于 2013-07-21T13:24:04.120 に答える
0

cout<<y--<<","<<--y;は、 に対する 2 つの順序付けられていない副作用を持つ式であるyため、動作は未定義です。

于 2013-07-21T13:19:38.730 に答える