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())是在被调用函数体执行之前排序的。
因此,赋值表达式的右操作数在左操作数之后排序,导致观察到的行为。这意味着计算顺序如下:
C 标准的更新预计会指定此行为,明确赋值表达式的右操作数是有序的在左操作数之前。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3