C の代入ステートメントの評価順序
指定されたコード スニペット内:
map< int、int> mp;<br>printf("%d ", mp.size());<br>mp[10]=mp.size();<br>printf("%dn", mp[10]);<br>
「0 1」という一見直感に反した出力は、代入の部分式の評価順序が不特定であることから生じます。
C 標準による、代入ステートメントの評価順序は未定義です。 ただし、動作は次のとおりです。
したがって、コード スニペットでは、mp.size() は 0 と評価され、mp[10] に割り当てられます。次に、mp[10] が再度評価され、割り当てられた値 (1) が返されます。
現在の C 標準では仕様が規定されていないにもかかわらず、この動作は最近の提案で対処されています ( N4228):
N4228 は、上記のケースを含む特定のケースに対して評価ルールを明確に定義するために、評価ルールの順序を調整することを提案しています。この提案によれば、代入の右オペランドは左オペランドの前に配置されます。
これは、C 17 以降では、コード スニペットの動作が明確に定義される可能性が高く、結果として「1 1」の出力。
以上がC の代入ステートメントの評価順序は出力にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。