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 を出力します。これは次の理由によるものです。
未指定の動作
この特定の動作は、C 標準では未指定です。ただし、最近の提案 (N4228) では、そのような場合の評価順序を明確にしようとしています。
改訂された提案のセクション [expr.ass]p1 では、次のように述べられています。
「正しいオペランドは次のとおりです」
これは、上記の例では、mp.size() が mp[10] の前に評価され、予想される出力 0 と 0 が得られることを意味します。
Update
提案 p0145 のリビジョン 3 に従って、C 17 ではこの動作が標準で指定されていることに注意することが重要です。代入ステートメントでは、右側のオペランドが左側のオペランドの前に明示的に順序付けされるようになりました。
以上がC でマップ値を割り当てると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。