为何这段简单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
相关产品推荐
相关产品推荐

