ホームページ > バックエンド開発 > C++ > C でマップ値を割り当てると予期しない結果が生じるのはなぜですか?

C でマップ値を割り当てると予期しない結果が生じるのはなぜですか?

DDD
リリース: 2024-10-28 15:10:02
オリジナル
601 人が閲覧しました

 Why Does Assigning a Map Value in C   Produce Unexpected Results?

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

C でマップに値を代入する場合、評価の順序によって直感に反する結果が生じる可能性があります。次のコードを考えてみましょう。

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

このコードは 0 と 0 を期待するかもしれませんが、0 を出力してから 1 を出力します。これは次の理由によるものです。

  1. 右から左評価: C の代入演算子は右から左に関連付けられます。つまり、mp[10] は mp.size() の前に評価されます。
  2. 一時参照: 左側割り当ての mp[10] は、基になるマップ要素への一時参照を作成します。この要素は初期化されていないため、mp.size() は最初に 0 を返します。
  3. 値の変更: 代入 mp[10]=mp.size() は mp[10] の値を設定します。 ] をマップの現在のサイズ (0) に変更します。
  4. Reference Life Extension: この割り当てにより、mp[10] によって作成された一時参照の存続期間が一時的に延長されます。
  5. 最終評価: mp[10] は変更された要素を指しているため、 printf("%d", mp[10]);更新された値 1 を出力します。

未指定の動作

この特定の動作は、C 標準では未指定です。ただし、最近の提案 (N4228) では、そのような場合の評価順序を明確にしようとしています。

改訂された提案のセクション [expr.ass]p1 では、次のように述べられています。

「正しいオペランドは次のとおりです」

これは、上記の例では、mp.size() が mp[10] の前に評価され、予想される出力 0 と 0 が得られることを意味します。

Update

提案 p0145 のリビジョン 3 に従って、C 17 ではこの動作が標準で指定されていることに注意することが重要です。代入ステートメントでは、右側のオペランドが左側のオペランドの前に明示的に順序付けされるようになりました。

以上がC でマップ値を割り当てると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート