为什么 "for (i = 100; i <= 0; --i)" 循环会无限循环?

3
unsigned int i;
for (i = 100; i <= 0; --i)
    printf("%d\n",i);

4
准备好被答案淹没了。 - Anycorn
取决于你想让代码做什么... - Michael Burr
@aaa:它们都不一样。 :) - James
9个回答

11

如果想要循环从100到0,请在循环的第二个条件中使用i >= 0

此外,就像其他人指出的那样,您需要将定义的i更改为有符号整数(只需使用int),因为当计数器应为-1时,它将是某个其他正数,因为您将其声明为unsigned int


7
如果你想让循环从100到0,应该是 i <= 100 而不是 i >= 0。否则,i >= 0 会导致无限循环。 - Windows programmer
我不这么认为?我认为当循环中的第二个语句为假时,循环就会退出? - John
1
"循环中第二个语句为假时,循环就跳出了吧?" -- 是的。 "如果想让循环从100到0,循环的第二个条件应该是 i >= 0" -- 还是不行,那会导致一个无限循环。 - Windows programmer
2
@John:它永远不会为假。当它等于零时,它将被递减并溢出到最大的uint大小。直至无穷大... - James
我真的很担心这些年来我的for循环写错了!;) - John
既然你也解决了无符号整数下溢的问题,我现在会投票支持你的。 - alesplin

10

因为 i 是无符号数,它永远不会小于零。 去掉unsigned。另外,将<=交换为>=


7

由于i是无符号的,表达式i <= 0是可疑的并且等同于i == 0

而且,由于条件i <= 0在第一次评估时为假,所以代码不会打印任何内容。


4

如果代码没有任何作用,那么就没有问题。

假设你想让它从100打印循环索引i到1,你需要将i <= 0改为i > 0

因为它是无符号整数,所以你不能使用i >= 0,否则会导致它无限循环。


我并不完全同意。如果代码本来就什么都不做,那么那里面的代码就太多了。 :) - Jack Leow

2

可能是 <= 0 吗?因为它从一开始就是 false

for 循环

  • 初始化:i = 100
  • 测试:i <= 0 // 第一次循环时为 false

将测试条件改为 i > 0 (循环100次)

或者使用声明 signed int i; 以及测试条件 i >= 0(循环101次),这样它实际上会逐渐减少到 -1。无符号整数会从 0 增加到最大整数(溢出)。


2
循环检查条件为i <= 0; i永远不会小于或等于零。它的初始值为100。

2

从技术上讲,这段代码没有问题。尽管 i 是无符号的,但测试 i <= 0 是合法的,当 i 为 0 时为 true,否则为 false。在您的情况下,i 永远不会是 0,所以这个条件判断实际上是多余的。


2
我猜你的意思是测试应该是i>0

是的。不幸的是,看起来你替他完成了他的家庭作业。 - Windows programmer

0
如果你想要打印从100到0的所有数字,那么你需要:
unsigned int i;
for (i = 100; i >= 0; --i)
    printf("%d\n",i);

在您的原始代码中,第一次循环运行时,i 的值为100。测试“100 <= 0”失败,因此没有任何内容显示。


1
还有一个问题,循环不会退出,因为i被声明为无符号。请参见我的答案中的讨论。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接