13
x = 1;
std::cout << ((++x)+(++x)+(++x));

出力はであると思いますが11、実際は12です。なんで?

4

5 に答える 5

65

特定の結果ではなく、未定義の動作を期待して説明します。式は、シーケンスポイントを介さずにxを複数回変更しようとするため、その動作は未定義です。

于 2009-10-06T12:07:24.650 に答える
12

他の人が言っているように、CおよびC ++標準は、これが生成する動作を定義していません。

しかし、なぜ標準がそのようなことをするのかわからない人のために、「現実の世界」の例を見てみましょう。

1 * 2 + 3 + 4 * 5

1 * 2 + 3を計算する前に計算しても問題はありません4*5。乗算の優先順位が加算よりも高いからといって、加算を実行する前に式ですべての乗算を実行する必要があるわけではありません。実際、計算を有効に実行できるさまざまな注文があります。

評価に副作用がある場合、異なる評価順序が結果に影響を与える可能性があります。標準で動作が定義されていない場合は、それに依存しないでください

于 2009-10-06T12:34:21.803 に答える
4

これは実際には未定義です。C ++はステートメントの実行順序を明示的に定義しないため、コンパイラーに依存するため、この構文は使用しないでください。

于 2009-10-06T12:07:41.403 に答える
3

コードスニペットは、C /C++の両方で未定義動作を呼び出します。ここからシーケンスポイントについて読んでください。

于 2009-11-22T01:20:36.043 に答える
-1

私の意見では

cout<<((++x)+(++x)+(++x));

コンパイラは最初にプレフィックス++xを実行するため、xの値は次のようになります。

x = 2


++ xまでに、xは次のようになります

x = 3


++x後

x = 4


次に、xの値を追加します

x + x + x = 4 + 4 + 4

x + x + x = 12

于 2015-02-23T14:24:12.200 に答える