」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼在 C++ 中分配給映射元素會導致意外的大小?

為什麼在 C++ 中分配給映射元素會導致意外的大小?

發佈於2024-11-04
瀏覽:750

 Why Does Assigning to a Map Element in C   Result in an Unexpected Size?

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())是在被呼叫函數體執行之前排序的。

因此,賦值表達式的右運算元在左運算元之後排序,導致觀察到的行為。這意味著計算順序如下:

  1. 計算右操作數:mp.size()
  2. 為左操作數建立值:mp[10]
  3. 將右操作數的值賦值給左操作數

C 標準的更新預計會指定此行為,明確賦值表達式的右操作數是有序的在左操作數之前。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3