ホームページ  >  記事  >  バックエンド開発  >  C でマップ要素に代入すると予期しないサイズが発生するのはなぜですか?

C でマップ要素に代入すると予期しないサイズが発生するのはなぜですか?

DDD
DDDオリジナル
2024-11-01 08:36:02171ブラウズ

 Why Does Assigning to a Map Element in C   Result in an Unexpected Size?

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

マップに値を代入すると、不可解な出力が得られることがあります:

このコードprints:

代入後のマップ サイズが 1 になると予想されるため、この結果は直観に反しているように見えるかもしれません。ただし、ここでは代入ステートメントの評価順序が重要な役割を果たします。

代入 mp[10] の左側は、マップ要素の基になる値への参照を返します。同時に、このアクションにより mp[10] 要素の新しい値が作成されます。この操作の後でのみ、マップの新しく計算されたサイズを使用して右側が評価されます。

この動作は C 標準では明示的に規定されていませんが、未指定の動作に該当します。最近の提案 N4228 は、そのようなケースを指定するために評価ルールの順序を改良することを目的としています。

草案 C 11 標準 (1.9) の関連セクションでは、個々の式の部分式の評価は一般に順序付けされていないと述べています。ただし、関数呼び出し (演算子 [] や size() など) は、呼び出される関数の本体の実行前に順序付けされます。

したがって、代入式の右側のオペランドは左側のオペランドの後に順序付けされ、結果は次のようになります。観察された動作。これは、評価の順序が次のとおりであることを意味します。

  1. 右側のオペランドを評価します: mp.size()
  2. 左側のオペランドの値を作成します: mp[10]
  3. 右オペランドの値を左オペランドに代入しますoperand

C 標準への更新では、この動作を指定することが期待されており、代入式の右オペランドが左オペランドの前に順序付けされることが明確になります。

以上がC でマップ要素に代入すると予期しないサイズが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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