首页  >  文章  >  后端开发  >  为什么在 C 中分配给映射元素会导致意外的大小?

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

DDD
DDD原创
2024-11-01 08:36:02171浏览

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

C 中赋值语句的求值顺序

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

<code class="cpp">map<int, int> mp;
printf("%d ", mp.size());
mp[10] = mp.size();
printf("%d\n", mp[10]);</code>

此代码打印:

0 1

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

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

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

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

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

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

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

以上是为什么在 C 中分配给映射元素会导致意外的大小?的详细内容。更多信息请关注PHP中文网其他相关文章!

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