ホームページ >バックエンド開発 >C++ >C の代入ステートメントの評価順序は出力にどのような影響を与えますか?

C の代入ステートメントの評価順序は出力にどのような影響を与えますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-29 12:36:02194ブラウズ

How Does the Order of Evaluation in C   Assignment Statements Affect the Output?

C の代入ステートメントの評価順序

指定されたコード スニペット内:

map< int、int> mp;<br>printf("%d ", mp.size());<br>mp[10]=mp.size();<br>printf("%dn", mp[10]);<br>

「0 1」という一見直感に反した出力は、代入の部分式の評価順序が不特定であることから生じます。

C 標準による、代入ステートメントの評価順序は未定義です。 ただし、動作は次のとおりです。

  1. 代入の右側 (この場合、mp.size()) が評価されます。最初に。
  2. 代入 (mp[10]) の左側は、右側から返された基になる値を参照するように変更されます。
  3. 次に、左側はその値を再度評価して、 で使用します。

したがって、コード スニペットでは、mp.size() は 0 と評価され、mp[10] に割り当てられます。次に、mp[10] が再度評価され、割り当てられた値 (1) が返されます。

現在の C 標準では仕様が規定されていないにもかかわらず、この動作は最近の提案で対処されています ( N4228):

N4228 は、上記のケースを含む特定のケースに対して評価ルールを明確に定義するために、評価ルールの順序を調整することを提案しています。この提案によれば、代入の右オペランドは左オペランドの前に配置されます。

これは、C 17 以降では、コード スニペットの動作が明確に定義される可能性が高く、結果として「1 1」の出力。

以上がC の代入ステートメントの評価順序は出力にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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