11

重複の可能性:
誰でもこれらの未定義の動作を説明できますか (i = i++ + ++i 、 i = i++ など…)

i = ++i;++i;where iis a integer with value はどう違います10か?

私によると、両方ともインクリメントの同じ仕事をします。iつまり、両方の式が完了した後i =11です。

4

6 に答える 6

10

i = ++i;Undefined Behavior を呼び出しますが、呼び出し++i;ません。

C++03 [セクション 5/4] は言うBetween the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression

Ini = ++i iは 2 回 [プリインクリメントと代入] 変更されており、その間にシーケンス ポイントがないため、動作は C と C++ で未定義です。

ただしi = ++i、C++0x では明確に定義されています :)

于 2010-10-12T11:50:49.883 に答える
7

書き込みi = ++i;は変数にi2 回書き込みます (1 回はインクリメント用、もう 1 回は代入用) 。2 つの間にシーケンス ポイントはありません。これは、C 言語標準によれば、未定義の動作を引き起こします。

これは、コンパイラが、 as (これは特定のパイプラインおよびキャッシュ関連の状況では実際に意味があります)、または as (ばかげていますが、技術的には標準で許可されている)i = ++iとして自由に実装できることを意味します。i = i + 1i = i + 2format C:\

于 2010-10-12T11:56:35.603 に答える
3

i = ++i は、必ずというわけではありませんが、多くの場合、次の結果を返します。

私=私;

私は+1;

i = 10を与える

コメントで指摘されているように、これは未定義の動作であり、決して信頼すべきではありません

++i は常に与えますが、

i = i+1;

これにより、i = 11;

したがって、それを行う正しい方法です

于 2010-10-12T11:56:48.610 に答える
2

i がスカラー型の場合、i = ++iは UB であり、++iと同等i+=1です。i がクラス型であり、そのクラスにオーバーロードされた operator++ がある場合 、これは UB ではないi = ++iと同等であり、入れたセマンティクスで を実行するだけです。i.operator=(operator++(i))++i++ operator

于 2010-10-12T12:01:45.210 に答える
1

最初の結果は未定義です。

于 2010-10-12T11:51:30.850 に答える
1

これらの式はシーケンス ポイントに関連しており、最も重要なことは、最初の式が未定義の動作になることです。

于 2010-10-12T11:57:52.730 に答える