C 17 i = i 1 を合法化します。演算子の評価順序の改訂により
C 11 では、代入 i = i 1;未定義の動作とみなされていました。ただし、C 17 では有効な表現になりました。この変更を理解するには、演算子評価の改訂されたルールを詳しく調べる必要があります。
C 17 以前の未定義の動作
C 11 では、オペランド評価の順序代入演算子の値の計算は次のように定義されました。
i = i 1; では、ポスト-increment i は副作用 (i の値の変更) を示し、代入操作とインターリーブされる可能性があります。この順序付けされていない副作用の可能性により、未定義の動作が発生しました。
C 17 の改訂された順序付けルール
C 17 では、代入演算子に対する新しい順序付けルールが導入されました:
この改訂されたルールは、右側のオペランドの値の計算と副作用の両方に適用されます。
i = i 1;
の合法化i = i 1; では、右側のオペランドは i 1 です。この式の評価には、範囲内の i の後置インクリメントが含まれます。新しいルールによれば、この評価全体は順序付けされ、i への代入前に完了します。
したがって、C 17 では、i を変更する行為 (副作用)実際の割り当ての前に完了するため、順序付けされていない副作用が発生する可能性が排除されます。この修正された順序付けにより、i = i 1 になります。 C 17 で有効な表現です。
以上が`i = i 1;` が C 17 で合法になったのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。