任何人都可以在以下代码中解释for循环的工作原理:
#include<stdio.h>
#include<conio.h>
int main()
{
char i=0;
for(i<=5&&i>=-1;++i;i>0)
printf("%d\n",i);
getch();
}
答案 0 :(得分:2)
让我们打破for语句,我们有三个阶段,初始化,测试和修饰符:
for(<Initialiser>; <Test>; <Modifier>)
<content>;
在你的情况下:
for(i<=5&&i>=-1;++i;i>0)
// initialiser: i<=5&&i>=-1;
// test: ++i;
// modifier: i>0
首先完成初始化。这里没有完成任务。两个布尔表达式(由>=
和<=
运算符表示,在逻辑&&
中进行比较。整个初始化器返回一个布尔值但它没有做任何事情。它可能是留空;
,不会有任何变化。
测试使用预增量运算符,因此返回i+1
的结果。如果此结果为0
,则其评估为false
,并且循环将终止。对于任何非零值,它的计算结果为true
并继续。这通常在i
初始化为小于零的值时使用,因此测试将递增i
,直到i+1
导致零,此时循环终止。
最后我们有了修饰符,在这种情况下,它只是使用>
运算符来计算布尔值。这里也没有完成任务。
事实是,你已经完成了测试并且修改器混淆了并将它们置于错误的位置但在我们解决之前让我们看看它是如何工作的......
我们从:
开始char i = 0;
...并且出于所有意图和目的,这与我们的for循环器初始化器在正常情况下会做的事情相同。接下来要评估的是for循环的初始化:
i<=5 && i>=-1;
由于i
为0
,因此5
小于或等于-1
且大于或等于1
。此表达式的计算结果为++i;
,但该值未执行任何操作。我们所做的只是浪费一点时间进行评估。
接下来是测试是否应该执行for循环内部块的修饰符:
1
此评估结果为i
,并将该值分配给printf("%d\n",i);
。现在,当它被评估为非零数字时,循环执行:
1
数字i>0
将打印到屏幕上......现在它是执行的修饰符:
i
嗯,1
为0
,因此大于1
。这评估为++i
(或true)。无论哪种方式,这都被忽略了。修饰符的目的不是测试或检查任何东西。它就在那里,你可以在每次for循环迭代时改变程序的状态。无论哪种方式,循环重复,它将在很长一段时间内完成。为什么?因为#include<stdio.h>
#include<conio.h>
int main()
{
for(char i=0; i<=5&&i>=-1; ++i)
printf("%d\n",i);
}
将在一段时间内评估为非零数字。它是否会终止取决于你的系统如何处理整数溢出。
这就是你的意思:
i
你看到了区别吗?我们的初始化程序现在启动循环,状态为-1
为零。然后我们测试它是否在5
到i
的范围内,每次迭代时我们都会1
增加0
1
2
3
4
5
。此循环将输出:
{{1}}
答案 1 :(得分:1)
此片段:
for(i<=5&&i>=-1;++i;i>0)
printf("%d\n",i);
与此相同:
i<=5 && i>=-1; //statement with no effect
while(++i)
{
printf("%d\n",i);
i>0; //statement with no effect
}
所以,它将打印i
,直到++i
计算为0.这将在i
溢出后变为负值,然后向0递增。这将需要255次迭代才会发生,因为char
可以存储多达256个不同的值。
答案 2 :(得分:0)
for ( variable initialization; condition; variable update ) {
}
变量初始化阶段仅在for循环开始时完成一次。
每次在循环内运行代码之前检查条件。如果条件为假则退出循环。
变量更新在第一次迭代后完成,从第二次迭代开始,在条件检查之前完成。