为何下述C语言代码陷入无限循环?迭代次数与预期不符
问题分析:for循环陷入无限循环的原因
先看你的代码:
#define DELTA sizeof(int) int i; for (i = 10; i - DELTA >= 0; i -= DELTA)
核心原因:无符号类型的隐式转换
sizeof运算符的返回值是**size_t类型**(无符号整数类型),而循环变量i是有符号的int类型。C语言中不同符号的整数进行运算或比较时,会触发隐式类型转换,把有符号整数转为无符号整数参与计算。
具体执行逻辑:
- 假设系统中
int占4字节,DELTA的值为4(size_t类型)。 - 当
i递减到2时,i - DELTA计算的是2 - 4,作为有符号数结果是-2,但由于DELTA是无符号类型,i会先被转为size_t,-2转成无符号后会变成一个极大的正数(比如SIZE_MAX -1),显然满足>=0的条件,循环继续。 - 后续
i会变成-2、-6……每次计算i - DELTA时,负数的i都会被转成无符号大正数,循环条件永远为真,最终陷入无限循环。
解决方法
- 把
DELTA强制转换为有符号整数类型:
这样运算时两边都是#define DELTA (int)sizeof(int)int类型,不会触发无符号转换,循环会按预期执行3次(10→6→2,第三次循环后i变为-2,i-DELTA=-6 >=0不成立,循环终止)。 - 或者将循环变量
i改为size_t类型,但需要调整初始值和循环逻辑(无符号数不会小于0)。
内容的提问来源于stack exchange,提问作者WilliamZhang
相关产品推荐
相关产品推荐

