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())是在被调用函数体执行之前排序的。
因此,赋值表达式的右操作数在左操作数之后排序,导致观察到的行为。这意味着计算顺序如下:
C 标准的更新预计会指定此行为,明确赋值表达式的右操作数是有序的在左操作数之前。
以上是为什么在 C 中分配给映射元素会导致意外的大小?的详细内容。更多信息请关注PHP中文网其他相关文章!