C 賦值語句中的求值順序
在C 中為映射賦值時,求值順序可能會導致違反直覺的結果。考慮以下程式碼:
map<int int> mp;<br>printf("%d ", mp.size());<br>mp[10]=mp.size( );<br>printf("%dn", mp[10]);<br></int>
此程式碼先列印0,然後列印1,而人們可能會期望列印0 和0。這是因為:
未指定的行為
此特定行為在 C 標準中未指定。然而,最近的一項提案 (N4228) 試圖澄清這種情況下的求值順序。
修訂提案的[expr.ass]p1 節指出:
「正確的操作數是在左操作數之前排序。」
這意味著在上面的範例中,mp.size() 將在mp[10] 之前求值,從而得到預期的輸出0 和0。
更新
值得注意的是,在 C 17 中,此行為已在標準中根據提案 p0145 的修訂版 3 進行了指定。現在,在賦值語句中,右邊操作數明確排序在左運算元之前。
以上是為什麼在 C 中分配映射值會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!