首頁 > 後端開發 > C++ > 主體

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

Linda Hamilton
發布: 2024-10-30 20:57:30
原創
916 人瀏覽過

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!