You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何下述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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 23:49:54