基本for循环中的误解(C)

时间:2017-02-16 17:16:15

标签: c for-loop

我一直在浏览本网站上推荐的book练习。我遇到了以下基本代码,我无法完全理解。

#include <stdio.h>

int main(void)
{

int i;

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

return 0;
}

这是我在这个程序片段背后的理由:

  1. 变量i初始化为10
  2. 测试
  3. i是否大于或等于1,(总是如此)。
  4. 第三个表达式为:i = i / 2,因此i除以2,其值存储在i
  5. printf语句中i在每个printf语句后递增
  6. 我根本无法理解为什么这个程序的输出是:

    1 1 1 1 1 1 1 1 ...

    我知道条件陈述总是正确的,但不应该是第一个值:

    5 3 2 1 1 1 1 1

    基本上我似乎无法理解为什么i的值会立即存储为1。任何有关我的理由和/或对此问题的见解的更正都将受到赞赏。请原谅这个问题的基本性质。

2 个答案:

答案 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机器上,您可以使用morelessmyprog | 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(从而使此循环无限)。