在 C 中,賦值語句的求值順序並不總是直觀的。考慮以下程式碼:
<code class="cpp">map<int, int> mp; printf("%d ", mp.size()); mp[10]=mp.size(); printf("%d\n", mp[10]);</code>
這段看似簡單的程式碼令人驚訝地輸出“0 1”,這可能不是您所期望的。
要理解原因,我們必須深入研究C 評估順序的細節。賦值語句,如 C 標準的 [expr.ass](https://en.cppreference.com/w/cpp/language/operator_assignment) 所指定,「所有群組從右到左」。這表示右操作數先於左操作數求值。此外,C 標準規定,在賦值操作中,「賦值在左右運算元的值計算之後、賦值表達式的值計算之前進行排序。」
在我們的程式碼中,左運算元是mp [10],它本身就是一個賦值運算。右操作數是 mp.size(),其計算結果為 0,因為映射最初是空的。因此,程式碼實際上將 mp[10] 分配給 0。但是,分配操作是在 mp[10] 的值計算之前排序的。這意味著首先修改 mp[10] 的值,在映射中建立一個新條目並將其設為 0。然後才計算 mp[10] 的值,顯示新建立的值為 1 的條目.
這是 C 中看似意外的求值順序的明顯範例。為了避免此類意外,必須了解標準的規範並考慮操作的執行順序。在順序不重要或存在未定義行為的可能性的情況下,可以使用明確括號來控制計算順序。
以上是為什麼在 C 中即使 `mp` 為空,`mp[10] = mp.size()` 仍輸出 `1`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!