在 C 中,赋值语句的求值顺序并不总是直观的。考虑以下代码:
<code class="cpp">map<int, int> mp; printf("%d ", mp.size()); mp[10]=mp.size(); printf("%d\n", mp[10]);</code>
这段看似简单的代码令人惊讶地输出“0 1”,这可能不是您所期望的。
要理解原因,我们必须深入研究C 评估顺序的细节。赋值语句,如 C 标准的 [expr.ass](https://en.cppreference.com/w/cpp/language/operator_assignment) 所指定,“所有组从右到左”。这意味着右操作数先于左操作数求值。此外,C 标准规定,在赋值操作中,“赋值在左右操作数的值计算之后、赋值表达式的值计算之前进行排序。”
在我们的代码中,左操作数是mp[10],它本身就是一个赋值操作。右操作数是 mp.size(),其计算结果为 0,因为映射最初是空的。因此,代码实际上将 mp[10] 分配给 0。但是,分配操作是在 mp[10] 的值计算之前排序的。这意味着首先修改 mp[10] 的值,在映射中创建一个新条目并将其设置为 0。然后才计算 mp[10] 的值,显示新创建的值为 1 的条目.
这是 C 中看似意外的求值顺序的明显示例。为了避免此类意外,必须了解标准的规范并考虑操作的执行顺序。在顺序不重要或存在未定义行为的可能性的情况下,可以使用显式括号来控制计算顺序。
以上是为什么在 C 中即使 `mp` 为空,`mp[10] = mp.size()` 仍输出 `1`?的详细内容。更多信息请关注PHP中文网其他相关文章!