C 17 で i = i 1 を合法にする
C 11 では、式 "i = i 1" は次の理由により未定義の動作になります。順序性の保証が不十分です。ただし、C 17 では、この表現は合法になります。その理由は次のとおりです。
C 11
C 11 では、代入演算子 (=) の順序付け規則は、代入が右の値の計算後に順序付けされると述べていました。そして左側のオペランド。ただし、右側のオペランドの代入と副作用の相対的な順序については、特別なルールは存在しませんでした。この順序付けの欠如により、「i = i 1」のような場合に未定義の動作が発生し、副作用 (i のインクリメント) と割り当てが順序付けされない可能性がありました。
C 17
C 17 では、代入演算子の新しい順序付けルール「右オペランドは左オペランドの前に順序付けされる」が導入されています。これは、右側のオペランド内のすべての副作用と値の計算が、割り当て自体を含む左側のオペランドでアクションが実行される前に完全に順序付けされることを意味します。
「i = i 1」への影響
C 17 の新しい順序付けルールでは、i をインクリメントする (後置演算子によって実行される) 副作用が代入の前に発生することが保証されるため、式 "i = i 1" が正当になります。したがって、「i 1」の値を i に代入する行為は副作用から完全に分離され、C 11 に存在していた未定義の動作が排除されます。
要約すると、代入の順序付けルールの変更です。 C 17 の演算子は、「i = i 1」の評価が特定のシーケンスに従うことを保証し、割り当て自体に先立って i をインクリメントする副作用を許可し、C 11 に存在した未定義の動作を解決します。
以上がC 17 では「i = i 1」が正当であるのに、C 11 では未定義の動作になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。