次の特定の式が未定義の動作を引き起こすのはなぜですか?
int i = 5;
i = (i,i++,i) + 1
私の質問は、ここのアルスの質問の影響を受けています
未定義ではありません。
C、シーケンスポイント、および半順序についてここで回答しました
同じことがC++にも当てはまると思います(そして、そのリンクを見る前の私の応答は次のとおりです):
コンマ演算子はシーケンスポイントを導入します(そして、式が評価されなければならない順序をある程度制約します-右の前に左)、したがって:
i
、シーケンスポイント(2番目のコンマ)で区切られます。i
inの変更は、i++
シーケンスポイントによって他のすべてから分離されています。i
byの変更は=
、式内の最後の出現から分離されていませんが、アクセスが「格納される値を決定する」ことを条件として、介在するシーケンスポイントなしでアクセスおよび変更できるため、問題ありません( 5/4)。i
i
標準では、ポストインクリメントと割り当てのどちらが最初に行われるかが定義されていないためです。それらの順序を決定するのはコンパイラの実装に任されています。
増分値をそれ自体に割り当てることは、C++では定義されていません。
i = i++
この後はどうあるべきi
ですか?それは前の値であるか、それとも前の値を1つ加えたものである必要がありますか?実行の順序はコンパイラーに任されているため、プラットフォームが異なれば結果も異なります。