「i = i 1」は C 17 で法的に定義されていますか?

Linda Hamilton
リリース: 2024-10-29 03:02:02
オリジナル
569 人が閲覧しました

 Is `i = i     1`  Legally Defined in C  17?

C 17 における i = i 1 の合法性

C 17 では、式 i = i 1 を合法化する微妙だが重要な変更が導入されました。これは、C 11 では以前は未定義の動作でした。

C 17 より前

C 11 では、代入式の評価順序は次のように指定されていました。

  • 右側と左側のオペランドの値の計算は、実際の代入の前に順序付けされます。
  • ただし、代入自体と右側の潜在的な副作用との間には、特定の順序付け要件はありませんでした ( RHS)expression.

i = i 1; の場合、これは、後置演算子を使用して i をインクリメントする副作用が代入の前後に発生する可能性があることを意味します。この順序付けの欠如により、未定義の動作が発生しました。

C 17 の変更点

C 17 では、代入演算子の仕様に次のような追加の文が導入されました。左オペランドの前に配列されます。」この一見無害な追加は、広範囲にわたる影響を及ぼします。

RHS を LHS よりも前に配列することにより、C 17 は RHS の副作用が割り当て自体の前に確実に発生するようになりました。これにより、割り当てアクションが潜在的な未定義の動作から効果的に分離されます。

例の書き換え

この変更を説明するために、i = i 1; の評価を分解してみましょう。 C 17:

  1. 右オペランド (RHS) の値の計算: i 1

    • 後置を使用して i をインクリメントします (副作用)。
    • 増分された値に 1 を追加します。
  2. LHS よりも前の RHS の順序:

    • RHS のすべての副作用 (増分を含む) が発生します.
  3. 左オペランド (LHS) の値の計算: i

    • i の現在の値が使用されます。
  4. 代入:

    • RHS の結果を LHS に代入します。

すべての副作用がRHS が代入の前にある場合、C 17 はそのような式における未定義の動作の可能性を完全に排除します。

以上が「i = i 1」は C 17 で法的に定義されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!