i = ++i;
と++i;
where i
is a integer with value はどう違います10
か?
私によると、両方ともインクリメントの同じ仕事をします。i
つまり、両方の式が完了した後i =11
です。
i = ++i;
と++i;
where i
is a integer with value はどう違います10
か?
私によると、両方ともインクリメントの同じ仕事をします。i
つまり、両方の式が完了した後i =11
です。
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 では明確に定義されています :)
書き込みi = ++i;
は変数にi
2 回書き込みます (1 回はインクリメント用、もう 1 回は代入用) 。2 つの間にシーケンス ポイントはありません。これは、C 言語標準によれば、未定義の動作を引き起こします。
これは、コンパイラが、 as (これは特定のパイプラインおよびキャッシュ関連の状況では実際に意味があります)、または as (ばかげていますが、技術的には標準で許可されている)i = ++i
として自由に実装できることを意味します。i = i + 1
i = i + 2
format C:\
i = ++i は、必ずというわけではありませんが、多くの場合、次の結果を返します。
私=私;
私は+1;
i = 10を与える
コメントで指摘されているように、これは未定義の動作であり、決して信頼すべきではありません
++i は常に与えますが、
i = i+1;
これにより、i = 11;
したがって、それを行う正しい方法です
i がスカラー型の場合、i = ++i
は UB であり、++i
と同等i+=1
です。i がクラス型であり、そのクラスにオーバーロードされた operator++ がある場合
、これは UB ではないi = ++i
と同等であり、入れたセマンティクスで を実行するだけです。i.operator=(operator++(i))
++i
++ operator
最初の結果は未定義です。
これらの式はシーケンス ポイントに関連しており、最も重要なことは、最初の式が未定義の動作になることです。