我一直在浏览本网站上推荐的book练习。我遇到了以下基本代码,我无法完全理解。
#include <stdio.h>
int main(void)
{
int i;
for (i = 10; i >= 1; i /= 2)
printf("%d ", i++);
return 0;
}
这是我在这个程序片段背后的理由:
i
初始化为10
。i
是否大于或等于1
,(总是如此)。i = i / 2
,因此i
除以2
,其值存储在i
。printf
语句中i
在每个printf
语句后递增。我根本无法理解为什么这个程序的输出是:
1 1 1 1 1 1 1 1
...
我知道条件陈述总是正确的,但不应该是第一个值:
5 3 2 1 1 1 1 1
?
基本上我似乎无法理解为什么i
的值会立即存储为1
。任何有关我的理由和/或对此问题的见解的更正都将受到赞赏。请原谅这个问题的基本性质。
答案 0 :(得分:3)
正如@abelenky指出的那样,正确的输出是10 5 3 2 1 1 1 ...
。您在推理中唯一的错误是在再次测试条件之前,语句i /= 2
在 for循环体之后被评估。因此,编写相同循环的另一种方法是
for(i = 10; i >= 1; i = (i + 1) / 2)
printf ("%d ", i);
如果您在Windows上运行,请尝试通过more
myprog | more
分页输出。这应该允许您查看此无限循环的输出的开头。在Linux机器上,您可以使用more
或less
:myprog | less
获得相同的结果。感谢@EugeneSh提出这可能是问题的建议。
我发现查看这样的程序的初始输出的另一种方法是在使用 Enter 启动程序后立即按 Ctrl + C 大骨节病>。这不是一种“标准”方法,可能需要非常快速的反应来获得像你这样的快速循环的任何结果。
最后的建议是直接限制你从程序中产生的输出:
int i, count;
for(i = 10, count = 0; i >= 1 && count < 100; i /= 2, count++)
printf("%d ", i++);
这将添加一个计数器,在打印100个数字后将停止输出,并允许您查看第一个数字。
答案 1 :(得分:0)
在第二行,你有&#39; i ++&#39;。 因此,在循环的每次迭代中,它也将i递增1。
假设你开始循环时i = 1。首先它将除以2(i / = 2)。由于我是一个整数,它将变为0.然后,在第二行,你有&#39; i ++&#39;,从而递增i。
因此,在循环迭代结束时,我将返回到等于1(从而使此循环无限)。