C 17 における i = i 1 の合法性
C 17 では、式 i = i 1 を合法化する微妙だが重要な変更が導入されました。これは、C 11 では以前は未定義の動作でした。
C 17 より前
C 11 では、代入式の評価順序は次のように指定されていました。
i = i 1; の場合、これは、後置演算子を使用して i をインクリメントする副作用が代入の前後に発生する可能性があることを意味します。この順序付けの欠如により、未定義の動作が発生しました。
C 17 の変更点
C 17 では、代入演算子の仕様に次のような追加の文が導入されました。左オペランドの前に配列されます。」この一見無害な追加は、広範囲にわたる影響を及ぼします。
RHS を LHS よりも前に配列することにより、C 17 は RHS の副作用が割り当て自体の前に確実に発生するようになりました。これにより、割り当てアクションが潜在的な未定義の動作から効果的に分離されます。
例の書き換え
この変更を説明するために、i = i 1; の評価を分解してみましょう。 C 17:
右オペランド (RHS) の値の計算: i 1
LHS よりも前の RHS の順序:
左オペランド (LHS) の値の計算: i
代入:
すべての副作用がRHS が代入の前にある場合、C 17 はそのような式における未定義の動作の可能性を完全に排除します。
以上が「i = i 1」は C 17 で法的に定義されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。