重複の可能性:
シーケンスされていない値の計算(別名シーケンスポイント)
未定義の動作とシーケンスポイント
演算子の優先順位と評価の順序
次の式が未定義の動作をどのようにもたらすかについて、私はまだ頭を悩ませようとしています。
a = a++;
これについてSOを検索したところ、次の質問が見つかりました。
私はすべての答えを読み通しましたが、それでも詳細に問題があります。回答の1つは、上記のコード例の動作を、a
変更方法の観点からあいまいであると説明しています。たとえば、次のいずれかになります。
a=(a+1);a++;
a++;a=a;
a
の変更があいまいになるのは何ですか?これは、さまざまなプラットフォームのCPU命令と関係があり、オプティマイザーが未定義の動作をどのように利用できるかを示していますか?言い換えれば、生成されたアセンブラのために未定義のように見えますか?
コンパイラが使用する理由はわかりa=(a+1);a++;
ません。奇妙に見え、あまり意味がありません。このように動作させるためのコンパイラは何を持っているでしょうか?
編集:
明確にするために、私は何が起こっているのかを理解しています。演算子の優先順位(基本的に式の評価の順序を定義する)にルールがある場合に、それがどのように未定義になるかを理解していません。この場合、割り当ては最後にa++
行われるため、割り当てる値を決定するために、最初に評価する必要がありますa
。したがって、私が期待しているa
のは、修正後の増分中に最初に変更されますが、次に割り当てる値が生成されることですa
(2番目の変更)。しかし、演算子の優先順位の規則は、動作を非常に明確にしているように見えます。未定義の動作をするための「小刻みに動く余地」がある場所を見つけることができません。