C++中vector.size()参与条件判定时if语句未按预期跳转的问题
问题根因
这个问题是C++的隐式类型转换规则导致的,属于代码写法错误,和编译器bug无关:
std::vector::size()的返回值是标准规定的size_t类型,这是无符号整数类型- 表达式
digits.size() - 1 - i运算时,所有参与运算的有符号值(常量1、int类型的i)都会被隐式提升为size_t类型,整个表达式的最终结果也是size_t无符号类型 - 无符号类型的取值范围永远大于等于0,因此
(size_t类型的值) < 0这个判断在编译期就能确定永远为假,编译器会直接优化掉条件判断逻辑,生成无条件跳转到else分支的指令,也就是你反汇编里看到的jmp操作。
为什么Debugger显示表达式值为true
Debugger展示表达式结果时,默认会把运算结果转换为有符号整数显示,你看到的-1是转换后的有符号值,而编译器实际做判断时用的是无符号值,此时运算的无符号结果是一个极大的正数(因为无符号数减法下溢),自然永远不满足小于0的条件。
为什么存入int变量后逻辑正常
你把无符号的运算结果赋值给有符号int类型的test变量时,值会做一次显式的类型转换,下溢的无符号值会被转换为对应的负有符号值,此时test < 0是两个有符号整数的比较,逻辑自然符合预期。
修复方案
只要在运算前把size()的返回值强制转换为有符号类型即可,示例:
if ((int)digits.size() - 1 - i < 0) { // 正常执行逻辑 }
注意:如果你的业务场景中vector长度可能超过int的最大值(leetcode题目场景几乎不会出现这个情况),可以换用int64_t等更大范围的有符号类型做转换。
这个行为是C++标准规定的,所有符合标准的编译器(GCC、Clang、MSVC)都会有相同的处理,不是某个编译器特有问题。
内容的提问来源于stack exchange,提问作者xbeckers
相关产品推荐
相关产品推荐

