2

ACCU の過負荷に関する興味深い記事 #115: "Demons May Fly Out Of Your Nose" を読んでいると、著者が次のように言っているのを見つけました。

シーケンス ポイント間では、関連する変数の状態について仮定を行うことはできません。これは、C では、他のほとんどの言語とは異なり、次の式が未定義の動作につながることも意味します。

v[i] = i++;

代入演算子はCのシーケンスポイントを表していないため

ここでUBを意味する詳細な理由を誰か説明できますか? v[i] が i をエイリアシングする可能性を除いて、ここでは見ることができない、2 つのシーケンス ポイント間で同じ変数に複数の書き込みを行うことが問題になると思いました...

4

3 に答える 3

3

i同じシーケンス ポイント内に読み取りと書き込みがあります。つまりi++、 のアドレスを計算した後または前に i を変更できますv[i]。実際、この動作は定義されていないため、これらのいずれも実行できない可能性があります。たとえば、コンパイラはステートメントが到達不能であると想定して削除する可能性があります。(または鼻から鬼を飛ばすなど)

于 2013-07-03T21:32:29.613 に答える