首页  >  文章  >  后端开发  >  为什么在 C 中即使 `mp` 为空,`mp[10] = mp.size()` 仍输出 `1`?

为什么在 C 中即使 `mp` 为空,`mp[10] = mp.size()` 仍输出 `1`?

Linda Hamilton
Linda Hamilton原创
2024-10-30 20:57:30899浏览

Why Does `mp[10] = mp.size()` Output `1` in C   Even If `mp` is Empty?

C 赋值语句中的求值顺序难题

在 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中文网其他相关文章!

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