注册 登录
编程论坛 C语言论坛

运行包含以下代码段的程序将可能进入死循环,为什么是错的?

成诺 发布于 2022-11-05 19:36, 1174 次点击


int i = 1;
while(i>0){ i++; printf("%d ",i); }
2 回复
#2
不会游泳的虾2022-11-05 22:11
理论上这段代码是死循环,因为判断条件是 i > 0 ,循环体里 i++ ,所以 i 的值是始终大于 0 的。但计算机硬件位数是有限的,那么当 i 增长到超出所能表达的数据范围的数时溢出,i 的值就出现 i < 0 的情形,此时就不满足循环的条件了,退出循环。上面的代码稍加改造,可以去运行下,供参考:
程序代码:
#include <stdio.h>
int main()
{
    int i = 1;
    while(i > 0){ i+=i; printf("%d ",i); }
    return 0;
}


[此贴子已经被作者于2022-11-5 22:13编辑过]

#3
rjsp2022-11-05 22:12
具符号整型的溢出属于未定义行为。

编译器无须考虑i的溢出,那么在i不溢出的情况下,必然i>0成立。
即 while(i>0) 可优化为 while( true )
1