这个for循环是如何工作的
int main(){
char i = 0;
for(i <= 5&amp;&amp; i&gt; = - 1; ++ i; i&gt; 0)
printf("%d \n",i);
printf("\n");
return 0;
}
答案 0 :(得分:2)
啊,谢谢你的澄清。
你问为什么你的例子中的for循环正在执行,即使已经交换了增量操作数和循环条件,以及变量是char的事实。让我们考虑for循环的正确结构:
for (initialise variable; for condition; increment variable)
{
//Do stuff
}
你的问题的答案很简单:
答案 1 :(得分:1)
让我们看看for循环的名称部分:
for( Expr1; Expr2; Expr3 )
DoStuff;
这是for循环的工作原理:
1.首先执行Expr1
。在你的循环中实际上什么也没做,因为它没有检查执行的结果。
然后执行Expr2
并将其结果视为条件,如果它0
终止循环,如果它是&#34;&#34;不是0&#34;转到第3步。在你的循环中,这意味着i
将递增,因此它现在为1,因此结果为true
。
然后它会运行DoStuff
部分,在您的情况下打印出我的值
接下来它执行Expr3
,不检查,只是运行它,在你的情况下什么都不做,因为它是一个条件,它的结果没有被使用。
接下来回到Expr2
执行它并检查它的结果。现在i
为2
,仍为true
条件。
再次执行DoStuff
部分并转到步骤4
一旦i
值更改回0
,循环就会停止。
什么时候?因为它的类型是char
,在达到127之后它会溢出到-128然后再增加到-1然后是0.然后停止。
答案 2 :(得分:1)
每当你想在这种情况下理解for循环时,你可以将循环转换为while来理解它。
for语法为:
for (initialization; condition; operation)
...
它可以转换为while:
初始化; while(condition){ ... 操作; }
所以在你的情况下
i <= 5 && i >= -1; // Initialization
while(++i) { //condition
printf("%d \n", i);
i > 0; // operation
}
初始化部分将在检查条件后执行。在你的情况下它是++i
所以每次递增。这里i>0
表示如果i == 0那么循环将停止它不会问题i
是正面还是负面在这种情况下要记住的Thumb规则是if(i == 0)然后true
否则为false。 i>0
仍然是真的)在每种情况下,所以循环是无限的。
要理解我在SO中看到的循环最佳答案是this
答案 3 :(得分:0)
关于for循环条件和递增操作的顺序没有规则,后者甚至不需要是递增操作。它的作用取决于你。代码与语义相同。
char i = 0;
i <= 5 && i >= -1; // Run before the loop and only once. No real effect here.
while (++i) { // Condition used to determine the loop should continue or break
printf("%d \n", i);
i > 0; // Run every time inside the loop. No real effect here.
}
BTW:它将是一个无限循环(因为++i
在溢出之前是非零值。)