C 中賦值語句的求值順序
給映射賦值時會得到令人費解的輸出:
map mp;
printf("%d ", mp.size());
mp[10] = mp.size();
printf("%d\n", mp[10]);
此程式列印:
0 1
這個結果可能看起來違反直覺,因為人們可能會期望分配後地圖大小為1。然而,賦值語句的求值順序在這裡扮演著至關重要的角色。
賦值 mp[10] 的左側傳回映射元素的基礎值的參考。同時,此操作為 mp[10] 元素建立一個新值。僅在此操作之後,才會使用新計算的地圖大小來評估右側。
此行為在 C 標準中未明確說明,但屬於未指定行為。最近的提案 N4228 旨在細化求值規則的順序以指定此類情況。
C 11 標準草案 (1.9) 的相關部分指出,單一表達式的子表達式的求值通常是不排序的。然而,函數呼叫(例如operator []和size())是在被呼叫函數體執行之前排序的。
因此,賦值表達式的右運算元在左運算元之後排序,導致觀察到的行為。這意味著計算順序如下:
C 標準的更新預計會指定此行為,明確賦值表達式的右操作數是有序的在左操作數之前。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3