-2

这段代码来自《C Programming-A Modern Approach》一书中的练习。

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

编辑:

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

请帮助我理解这段代码。

4

4 回答 4

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

于 2012-08-30T13:43:40.317 回答
1

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

所以代码导致无限循环。

于 2012-08-30T13:52:06.647 回答
0

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

print 将打印 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,我想你可以明白为什么。

于 2012-08-30T13:47:14.930 回答
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,然后你就得到了很多?

于 2012-08-30T13:50:56.390 回答