为什么下面的代码是一个无休止的循环?(用于循环)



这段代码来自《C编程-现代方法》一书中的一个练习。

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

编辑:

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

请帮助我理解此代码。

此代码显示

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]不再为真。

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

因此,代码产生了无限循环。

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

打印将打印i的值,然后将其递增一。所以

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永远打印,我想你能明白为什么。

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

说到这一点,应该如下:作为循环开始时的i=10,这将是您的输出。然后,i++i递增到11,在打印语句中发布使用情况。

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

i=1步骤中,您将获得1+1=2和2/2=1,一旦启动,循环将永远不会停止(因为测试i>=1将始终为真)。你确定你的输出从1开始,还是很快从10到1,然后你得到了很多?

最新更新