为什么以下代码是无限循环? (for循环)

时间:2012-08-30 13:41:06

标签: c

这段代码正在编写一本名为C programming-A Modern Approach的书中。

for(i=10;i>=1;i/=2)
{
    printf("%d", i++);
}

编辑:

第一个输出应该是10,并且它应该在循环的下一步中增加1.但是当我运行此代码时,我得到的是1,它永远不会停止打印1.

请帮我理解这段代码。

4 个答案:

答案 0 :(得分:7)

此代码说

for( start with 10 ; as long as it is greater or equals 1 ; divide i by 2){
    Print i;
    add 1 to i
}

所以:

start with 10:
print 10;
10 + 1 = 11
11 / 2 = 5,5 = 5 because it's int
print 5
5 + 1 = 6
6 / 2 = 3
print 3
3 + 1 = 4
4 / 2 = 2
print 2
2 + 1 = 3
3 / 2 = 1
print 1
1 + 1 = 2
2 / 2 = 1
print 1
1 + 1 = 2
2 / 2 = 1
.... and it will continue forever and ever

for循环的执行顺序:

for([init];[1];[3]){
    [2]
}

当然重复顺序[1],[2],[3]直到[1]不再为真

答案 1 :(得分:1)

代码少用。它将产生10 5 3 2 1 1 1 1 . . .无限次1的输出,因为当i除以2变为1时,值再次在printf语句ir中递增。 i++并成为2。

因此代码导致无限循环。

答案 2 :(得分:0)

我从10开始,只要我>它就会运行或= 1,每次迭代i减半(i / 2)。

打印将打印i的值,然后将其递增1。 SO

Iteration 1:
  10  (i+1 = 11)
Iteration 2:
  5   (i/2 = 5 + 1 = 6)
Iteration 3:
  3   (i/2 = 3 + 1 = 4)
Iteration 4:
  2   (i/2 = 2 + 1 = 3)
Iteration 5:
  1   (i/2 = 1 + 1 = 2)
...
Iteration N:
  1   (i/2 = 1 + 1 = 2)

之后的每次迭代都是1.这就是为什么你看到1永远打印的原因,我想你可以理解为什么。

答案 3 :(得分:0)

如果输出从1开始,那么循环中的测试条件将写为i=1,而不是i>=1。修复您的测试条件,您将看到循环正确执行。

说到这一点,应该如下:在循环开始时为i=10,这将是你的输出。 i++然后将i增加到11,在print语句中使用后。

当代码到达循环的底部时,它将执行循环步骤调整(i/=2)。这意味着11 \ 2 =新的i值。这将是5.然后代码将测试i的新值并再次循环,并将重复这些步骤,直到i < 1

i = 1步时,您将1+1 = 2且2/2 = 1,循环将永不停止(作为测试i>=1将永远是真的)。你确定你的输出从1开始,还是很快从10变为1然后你得到了很多?