C では、代入ステートメントの評価順序は必ずしも直感的であるとは限りません。次のコードを考えてみましょう。
<code class="cpp">map<int, int> mp; printf("%d ", mp.size()); mp[10]=mp.size(); printf("%d\n", mp[10]);</code>
この一見単純なコードは、驚くべきことに "0 1" を出力します。これは予想どおりではないかもしれません。
理由を理解するには、 C の評価順序の詳細。 C 標準の [expr.ass](https://en.cppreference.com/w/cpp/ language/operator_assignment) で指定されている代入ステートメントは、「すべて右から左にグループ化」されます。これは、右側のオペランドが左側のオペランドより前に評価されることを意味します。さらに、C 標準では、代入演算において「代入は、右オペランドと左オペランドの値の計算の後、代入式の値の計算の前に順序付けされる」と指定しています。
コードでは、左のオペランドは mp[10] で、これは代入演算そのものです。右側のオペランドは mp.size() ですが、マップは最初は空であるため、0 と評価されます。したがって、コードは効果的に mp[10] を 0 に割り当てます。ただし、代入操作は mp[10] の値を計算する前に順序付けされます。これは、最初に mp[10] の値が変更され、マップ内に新しいエントリが作成され、それが 0 に設定されることを意味します。その後のみ mp[10] の値が評価され、値 1 を持つ新しく作成されたエントリが表示されます。 .
これは、 C における一見予期せぬ評価順序の明らかな例です。このような予期せぬ事態を避けるためには、標準の仕様を認識し、操作が実行される順序を考慮することが重要です。順序が重要ではない場合、または未定義の動作が発生する可能性がある場合は、明示的な括弧を使用して評価順序を制御できます。
以上が`mp` が空であっても、C で `mp[10] = mp.size()` が `1` を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。