如何理解for循环中的auto类型推导?为何i初始值不为5且输出无数值?
问题原因解释
1. auto类型推导逻辑
- C++标准规定
std::vector<T>::size()的返回值类型是无符号整数类型size_t,该类型的取值范围永远非负。 auto size = nums.size();推导规则:auto会直接匹配右值的静态类型,因此size的类型被推导为size_t。auto i = 2 * size - 1;推导规则:表达式运算时,有符号int类型的字面量2会和无符号size_t类型的size做隐式类型转换,统一转为size_t后再计算,整个表达式2 * size - 1的返回类型是size_t,因此i最终被推导为无符号的size_t类型。
2. 异常运行结果的原因
- 关于初始值不等于5的问题:nums的长度是3,计算得到的
2*size -1数值上确实是5,但因为i是无符号size_t类型,和有符号int类型的5属于不同类型,部分类型校验逻辑或者调试工具会判定二者不相等,这就是该现象的来源。 - 关于无限输出的问题:循环终止条件是
i >= 0,但i是无符号整数,无符号整数的所有取值天然满足>=0的条件。当i递减到0之后,再次执行i--会触发无符号整数下溢,i会变成size_t类型的最大值(32位系统下为4294967295,64位系统下数值更大),仍然满足i>=0的条件,循环永远不会终止,因此会无限输出数值。
修复方案
显式指定size或者i的类型为有符号整数即可解决问题,示例代码如下:
int main() { vector<int> nums = {1, 2, 1}; int size = static_cast<int>(nums.size()); // 显式转为有符号int for(auto i = 2 * size - 1; i >= 0; i--) { std::cout << i << " "; } std::cout << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者douyu
相关产品推荐
相关产品推荐

