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

为何这段简单C语言while循环内的代码从未执行?

问题分析:为什么while循环从未执行?

嗨,这个问题的核心其实是C语言里有符号整数与无符号整数的隐式转换规则在作祟!我来给你拆解清楚:

关键原因:sizeof的返回类型是无符号数

sizeof()运算符的返回值类型是size_t,这是一个标准的无符号整数类型(具体对应unsigned int还是unsigned long取决于系统,但本质都是无符号)。

你的变量byte_sent是int类型的-1,当C语言遇到有符号数和无符号数进行比较时,会自动把有符号数转换成无符号数来参与运算。那-1转换成无符号数会变成什么?

  • 以32位系统为例,-1的二进制补码是全1(0xFFFFFFFF),转换成无符号整数后就是4294967295,这个值远远大于sizeof(int)的结果(通常是4)。
  • 所以不管你写while ((byte_sent < sizeof(int)))还是while (byte_sent < sizeof(int)),本质上都是在比较4294967295 < 4,结果必然是false,循环自然不会执行。

怎么解决?

有两种常见的修正方式:

  • 把sizeof(int)强制转换成有符号整数类型:
while (byte_sent < (int)sizeof(int)) {
    printf("We are in\n");
    break;
}
  • 或者把byte_sent定义为无符号类型(但要注意不能初始化为-1,因为无符号数没有负值):
size_t byte_sent = 0; // 改用无符号类型,初始值设为合理的非负数
while (byte_sent < sizeof(int)) {
    printf("We are in\n");
    break;
}

补充:为什么加不加括号结果一致?

你尝试的两种写法里的括号不影响运算结果,因为sizeof的优先级本来就高于<比较运算符,所以不管有没有括号,表达式都会先计算sizeof(int),再和byte_sent比较,因此两种写法的行为完全一致。

内容的提问来源于stack exchange,提问作者Que0Le

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:57:41