なぜ i = i 1; C 17 で合法になりました
C 11 では、コード スニペット「i = i 1;」未定義の動作が呼び出されました。ただし、C 17 では、このコードは法的に許容されるようになりました。この変更は、C 17 で導入された強化されたシーケンス保証に由来します。
C 11 標準 [N3337 Basic.exec] によれば、明示的に指定されない限り、副作用のシーケンスは順序付けされません。コード例では、代入演算子 (=) と後置増分演算子 () の両方に、正しく順序付けされていない場合に未定義の動作を引き起こす可能性がある副作用があります。
C 17 では、[ に新しい文が追加されました。 N4659 expr.ass] は、代入演算子の順序付け規則を明確にします:
The right operand is sequenced before the left operand.
この追加ステートメントにより、右オペランド内のすべての副作用が、代入を含む左オペランド内の副作用よりも先に実行されることが保証されます。
「i = i 1;」の場合、右側のオペランド (i 1) は後置インクリメント演算子 (i ) と定数 1 で構成されます。C 17 で導入された順序保証により、次のことが保証されます。後置インクリメントが実行され、代入が実行される前にその副作用が発生します。これにより、C 11 に存在していた未定義の動作が排除されます。
したがって、C 17 の強化されたシーケンス保証により、「i = i 1;」が行われます。右オペランドと左オペランドの副作用が正しく順序付けされ、未定義の動作が防止されることを保証することにより、合法的になります。
以上が「i = i 1;」が C 17 で正当な操作になったのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。