ホームページ  >  記事  >  バックエンド開発  >  C 17 では「i = i 1」が正当であるのに、C 11 では未定義の動作になるのはなぜですか?

C 17 では「i = i 1」が正当であるのに、C 11 では未定義の動作になるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-27 09:53:30262ブラウズ

Why is

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。