首页 >后端开发 >C++ >为什么在 C 中分配映射值会产生意外结果?

为什么在 C 中分配映射值会产生意外结果?

DDD
DDD原创
2024-10-28 15:10:02571浏览

 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>

此代码先打印 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn