首頁  >  文章  >  後端開發  >  為什麼在 C 中即使 `mp` 為空,`mp[10] = mp.size()` 仍輸出 `1`?

為什麼在 C 中即使 `mp` 為空,`mp[10] = mp.size()` 仍輸出 `1`?

Linda Hamilton
Linda Hamilton原創
2024-10-30 20:57:30896瀏覽

Why Does `mp[10] = mp.size()` Output `1` in C   Even If `mp` is Empty?

C 賦值語句中的求值順序難題

在 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中文網其他相關文章!

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