为什么我的程序在for循环之后没有打印出正确的值?

3

我正在尝试以下C代码:

#include <stdio.h>

int main()
{
    int i=10;
    int start=25;
    int end = 30;
    for(i = start; i < end; i++);
    {
        printf("%d\n", i);
    }
}

我知道在for循环的末尾有一个分号,这可以防止for循环重复迭代。但是我得到了输出“30”,而不是“25”。为什么会出现这种结果?变量i应该保留其起始值,对吧?


2
i25 开始,增加 5 次。然后将是 30.... - LPs
谢谢大家,你们的评论真的很有帮助。 - DrunkenMaster
6
这个问题实际上在问“为什么for循环计数”(预期的)。你可能想阅读C书中关于循环的章节。 - too honest for this site
3
为什么这个问题有8个赞? - user4520
6个回答

23
for(i = start; i < end; i++);

那段代码的意思是i等于25。循环会在i<30时继续执行。然后在循环结束后,i就像你写的那样变成了30

在循环结尾加上分号并不会停止循环,它仍然会被执行。在你的例子中,{}只是在主函数中开了一个不同的作用域


19

这段代码片段

for(i = start; i < end; i++);
{
     printf("%d\n", i);
}  

等价于

for(i = start; i < end; i++);
printf("%d\n", i);  

进一步扩展

for(i = start; i < end;)
{
    i++;   // This statement will execute till i < 30
}
printf("%d\n", i);   
条件语句i < end将在循环体内执行i++语句将i自增至30时,评估为false
现在,语句printf("%d\n", i);将被执行并打印变量i的值,即30

16
我知道在for循环的结尾有一个分号,它可以使for循环只迭代一次。
但这并不完全正确:在for循环后面的分号成为了“空循环体”,循环会迭代五次,在每次迭代时递增i。花括号中的语句仅在循环结束时执行一次。
此时,i变成30,因为这是循环的“后置条件”(即必须为真才能完成循环的条件)。这就是printf所打印出来的结果。

10
for(i = start; i < end; i++);

这个循环将迭代5次,直到i变成等于end30。它不会在第一次迭代后停止。

由于;的存在,以下的printf语句不是循环体的一部分,但是;并不意味着循环只迭代了1次。循环会一直迭代直到条件为true,但循环体内除了;以外没有其他内容。


8
由于冒号的存在,您的程序现在等同于以下内容:
#include <stdio.h>

int main()
{
        int i=10;
        int start=25;
        int end = 30;

        for(i = start; i < end; i++)
        {
                //do nothing
        }

        printf("%d\n", i);

}

你的循环将 i 增加到 30,然后输出它。


2
花括号内的代码(在for下面)不是您的for循环的一部分。 换句话说,由于在for语句末尾包含分号,因此您的循环没有主体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接