首頁 > 後端開發 > C++ > 為什麼在 C 中分配映射值會產生意外結果?

為什麼在 C 中分配映射值會產生意外結果?

DDD
發布: 2024-10-28 15:10:02
原創
582 人瀏覽過

 Why Does Assigning a Map Value in C   Produce Unexpected Results?

C 賦值語句中的求值順序

在C 中為映射賦值時,求值順序可能會導致違反直覺的結果。考慮以下程式碼:

map<int int> mp;<br>printf("%d ", mp.size());<br>mp[10]=mp.size( );<br>printf("%dn", mp[10]);<br></int>
登入後複製

此程式碼先列印0,然後列印1,而人們可能會期望列印0 和0。這是因為:

  1. 從右到左求值:C 中的賦值運算子從右到左關聯,這意味著mp[10] 在mp.size( ) 之前求值。
  2. 暫時參考:左側賦值 mp[10] 建立底層映射元素的暫時參考。該元素最初未初始化,因此 mp.size() 最初傳回 0。
  3. 值修改:賦值 mp[10]=mp.size() 設定 mp[10] 的值] 到地圖的目前大小,即 0。
  4. 引用壽命延長:賦值暫時延長了 mp[10] 所建立的暫時引用的壽命。
  5. 最終評估: mp[10] 現在指向修改後的元素,因此 printf("%d", mp[10]);列印更新後的值 1。

未指定的行為

此特定行為在 C 標準中未指定。然而,最近的一項提案 (N4228) 試圖澄清這種情況下的求值順序。

修訂提案的[expr.ass]p1 節指出:

「正確的操作數是在左操作數之前排序。」

這意味著在上面的範例中,mp.size() 將在mp[10] 之前求值,從而得到預期的輸出0 和0。

更新

值得注意的是,在 C 17 中,此行為已在標準中根據提案 p0145 的修訂版 3 進行了指定。現在,在賦值語句中,右邊操作數明確排序在左運算元之前。

以上是為什麼在 C 中分配映射值會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板