C++中含vector::size()的表达式计算异常?示例代码输出不符
为什么C++里包含vector大小的表达式计算不符合预期?
嘿,这个问题的核心是无符号整数的溢出特性在作祟,我来给你拆解清楚:
问题根源
vector::size()的返回类型是size_t,这是一个无符号整数类型(通常对应unsigned int或unsigned long long,取决于平台)。- 当你的vector是空的时候,
v.size()的值是0。这时候计算v.size() - 1,因为是无符号整数运算,不会得到-1——无符号整数不允许负数,所以会发生溢出回绕,结果变成该无符号类型能表示的最大值(比如32位系统上是4294967295)。 - 接下来比较
0 < 这个超大的正数,结果自然是true,所以代码会输出"true"。
解决办法
你可以通过以下几种方式避免这个问题:
- 先判断vector的大小是否大于1,再进行后续逻辑:
if (v.size() > 1) { printf("true"); } else { printf("false"); } - 把
size()的结果强制转换为有符号整数类型(如果vector的大小可能超过int范围,用long long会更稳妥):if (0 < static_cast<long long>(v.size()) - 1) { printf("true"); } else { printf("false"); }
内容的提问来源于stack exchange,提问作者user3288177
相关产品推荐
相关产品推荐

