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。这是因为:
未指定的行为
此特定行为在 C 标准中未指定。然而,最近的一项提案 (N4228) 试图澄清这种情况下的求值顺序。
修订提案的 [expr.ass]p1 节指出:
“正确的操作数是在左操作数之前排序。”
这意味着在上面的示例中,mp.size() 将在 mp[10] 之前求值,从而得到预期的输出 0 和 0。
更新
值得注意的是,在 C 17 中,此行为已在标准中根据提案 p0145 的修订版 3 进行了指定。现在,在赋值语句中,右操作数显式排序在左操作数之前。
以上是为什么在 C 中分配映射值会产生意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!