”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么在 C++ 中分配给映射元素会导致意外的大小?

为什么在 C++ 中分配给映射元素会导致意外的大小?

发布于2024-11-04
浏览:110

 Why Does Assigning to a Map Element in C   Result in an Unexpected Size?

C 中赋值语句的求值顺序

给映射赋值时会得到令人费解的输出:

map mp;
printf("%d ", mp.size());
mp[10] = mp.size();
printf("%d\n", mp[10]);

此代码打印:

0 1

这个结果可能看起来违反直觉,因为人们可能会期望分配后地图大小为 1。然而,赋值语句的求值顺序在这里起着至关重要的作用。

赋值 mp[10] 的左侧返回对映射元素的基础值的引用。同时,此操作为 mp[10] 元素创建一个新值。仅在此操作之后,才会使用新计算的地图大小来评估右侧。

此行为在 C 标准中未明确说明,但属于未指定行为。最近的提案 N4228 旨在细化求值规则的顺序以指定此类情况。

C 11 标准草案 (1.9) 的相关部分指出,单个表达式的子表达式的求值通常是不排序的。然而,函数调用(例如operator []和size())是在被调用函数体执行之前排序的。

因此,赋值表达式的右操作数在左操作数之后排序,导致观察到的行为。这意味着计算顺序如下:

  1. 计算右操作数:mp.size()
  2. 为左操作数创建值:mp[10]
  3. 将右操作数的值赋值给左操作数

C 标准的更新预计会指定此行为,明确赋值表达式的右操作数是有序的在左操作数之前。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3