3

以下のようないくつかのコード:

int x = 1;
printf("%d,%d,%d",x,x++,x);  //A  statement
cout<<x<<x++<<x<<endl; //B statement

実行シーケンスが右から左であることはわかっていますが、なぜAステートメントの結果は「1,1,1」で、Bステートメントの結果は「112」ですか?

vs2008 をデバッグ モードで使用しています。結果は同じです: 2,1,2。リリースモードあり: 結果が異なります: A: 1,1,1, B:1,1,2

4

4 に答える 4

1

使用方法printfにより、未定義の動作が発生します。関数の引数の評価順序は規定されていません。ある式の一部を評価してから別の式の一部を評価できるため、個別の単位で評価する必要さえありません。つまり、評価順序に特定の種類の依存関係がある場合、式全体が未定義になる可能性があります。

を呼び出す場合も同様operator <<ですcout<<はシーケンス ポイントではありません。そこにある cout のさまざまな句の評価順序は完全に指定されていません。また、例と同じ種類の評価への依存関係があるため、printfここでも未定義の動作を呼び出しています。

したがって、両方の式で同じ結果が得られる可能性があります。異なる結果が得られる場合があります。いずれかのデーモンを評価すると、デーモンが鼻から飛び出すことがあります。あなたにはわかりません。

シーケンス ポイントと評価の順序のトピックは、かなり複雑になる可能性があります。詳細を知りたい場合は、この質問をご覧になることをお勧めします。

于 2013-04-03T05:32:02.010 に答える
0

printf を使用すると、printf が呼び出される前にすべての引数が評価されます (x=1)。cout を使用すると、引数が評価され、順番に適用されます。(少なくともコンパイラに関する限り)

于 2013-04-03T05:28:51.653 に答える
0

この記事を読んでください。これは良いものです。

この記事の複製。

printf()しかし、 orについて話すと技術的には、ステートメントのcout<<実行中printfに、最後のステートメントが変数の値を変更し、変更された値が現在のステートメントではなく次のステートメントに影響を与えます。

ステートメント内でcoutは、変数の最新の値が取得されるため、現在のステートメントに直接影響します。

あなたが明確になることを願っています。

于 2013-04-03T05:29:31.227 に答える
0

ステートメント A と B の結果は同じです。

        int x = 1;
        printf("%d,%d,%d",x,x++,x);  //A  statement
        //cout<<x<<x++<<x<<endl; //B statement
        return 0;

ステートメント A

     int x = 1;
    //printf("%d,%d,%d",x,x++,x);  //A  statement
    cout<<x<<","<<x++<<","<<x<<endl; //B statement
    return 0;

ステートメント B

結果/動作はコンパイラと矛盾しています。

于 2013-04-03T05:32:54.680 に答える