首頁 >後端開發 >C++ >為什麼在 C 中分配給映射元素會導致意外的大小?

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

DDD
DDD原創
2024-11-01 08:36:02292瀏覽

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

C 中賦值語句的求值順序

給映射賦值時會得到一個令人費解的輸出:

<code class="cpp">map<int, int> mp;
printf("%d ", mp.size());
mp[10] = mp.size();
printf("%d\n", mp[10]);</code>
給映射賦值時會得到一個令人費解的輸出:

給映射賦值時會得到一個令人費解的輸出:
0 1

此程式碼列印:

這個結果可能看起來違反直覺,因為人們可能期望分配後地圖大小為1。然而,賦值語句的求值順序在這裡扮演著至關重要的角色。

賦值 mp[10] 的左側傳回映射元素的基礎值的參考。同時,此操作為 mp[10] 元素建立一個新值。僅在此操作之後,才會使用新計算的地圖大小來評估右側。

此行為未在 C 標準中明確說明,但屬於未指定行為。最近的提案 N4228 旨在細化求值規則的順序以指定此類情況。

    C 11 標準草案 (1.9) 的相關部分指出,單一表達式的子表達式的求值通常是不排序的。然而,函數呼叫(例如operator []和size())是在被呼叫函數體執行之前排序的。
  1. 因此,賦值表達式的右操作數在左運算元之後排序,導致觀察到的行為。這表示計算順序如下:
  2. 計算右邊操作數:mp.size()
為左運算元建立值:mp[10]

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

以上是為什麼在 C 中分配給映射元素會導致意外的大小?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn