5

次の特定の式が未定義の動作を引き起こすのはなぜですか?

int i = 5;
i = (i,i++,i) + 1 

私の質問は、ここのアルスの質問の影響を受けています

4

3 に答える 3

11

未定義ではありません。

C、シーケンスポイント、および半順序についてここで回答しました

同じことがC++にも当てはまると思います(そして、そのリンクを見る前の私の応答は次のとおりです):

コンマ演算子はシーケンスポイントを導入します(そして、式が評価されなければならない順序をある程度制約します-右の前に左)、したがって:

  • の2つの変更はi、シーケンスポイント(2番目のコンマ)で区切られます。
  • iinの変更は、i++シーケンスポイントによって他のすべてから分離されています。
  • ibyの変更は=、式内の最後の出現から分離されていませんが、アクセスが「格納される値を決定する」ことを条件として、介在するシーケンスポイントなしでアクセスおよび変更できるため、問題ありません( 5/4)。ii
  • Alsが言うように、実際には、誰もがそれを書かないという基本的な常識を持っていれば、そのコードが動作を定義しているかどうかは関係ありません;-)
于 2010-11-05T11:46:50.323 に答える
0

標準では、ポストインクリメントと割り当てのどちらが最初に行われるかが定義されていないためです。それらの順序を決定するのはコンパイラの実装に任されています。

于 2010-11-05T11:46:19.257 に答える
0

増分値をそれ自体に割り当てることは、C++では定義されていません。

i = i++

この後はどうあるべきiですか?それは前の値であるか、それとも前の値を1つ加えたものである必要がありますか?実行の順序はコンパイラーに任されているため、プラットフォームが異なれば結果も異なります。

于 2010-11-05T11:48:48.970 に答える