C++中为何-1 < s.length()返回false而0 < s.length()返回true
问题根因分析
这个现象完全是C++的隐式类型转换规则导致的,核心点如下:
std::string的length()、size()方法返回值类型为size_t,这是无符号整数类型,位宽和当前平台指针位宽一致(32位平台为4字节无符号数,64位平台为8字节无符号数),不存在负数取值。- C++的算术转换规则规定:当有符号整数和无符号整数做比较、算术运算时,会先把有符号值转换为对应的无符号类型,再执行后续操作。
第一段代码返回false的逻辑
对应测试代码:
string s = "abc"; int i = -1; cout<<(i < s.length());
- 字符串
s长度为3,因此s.length()返回无符号类型的数值3。 - 有符号int变量
i的值为-1,转换为无符号size_t类型时,会按照补码规则映射为该无符号类型的最大值:32位平台下为4294967295,64位平台下为18446744073709551615。 - 转换后的
i值远大于3,因此i < s.length()的比较结果为false。
第二段代码返回true的逻辑
对应测试代码:
string s = "abc"; int i = 0; cout<<(i < s.length());
- 同样
s.length()返回无符号数值3。 - 有符号int变量
i的值为0,转换为无符号size_t类型后数值仍然为0。 - 0小于3,因此比较结果为
true。
开发提示:日常写代码时,尽量避免直接拿带符号整型和
size_t类型的返回值(容器长度、sizeof运算结果等)直接比较。如果确实需要比较,建议先显式将无符号长度值转换为和变量一致的有符号类型,避免负数隐式转换为超大无符号数引发的逻辑bug。
内容的提问来源于stack exchange,提问作者Subhradeep Nag
相关产品推荐
相关产品推荐

