for循环的一般形式为:
for(表达式1; 表达式2; 表达式3){
语句块
}
执行过程如下:
先求解表达式1。
求解表达式2,若其值为真(非0),则执行循环体,否则结束循环。
执行完循环体,再求解表达式3。
重复执行步骤 2) 和 3),直到循环结束。
注意:表达式1仅在第一次循环时求解,以后都不会再执行,可以认为这是一个初始化语句。
for循环的执行过程
我们还是用小学数学题:求 1 + 2 + 3 +...+ 99 + 100 = ?
#include <stdio.h>
int main(){
int i, sum=0;
for(i=1; i<=100; i++){
sum+=i;
}
printf("%d\n",sum);
return 0;
}
运行结果:
5050
代码分析:
执行到 for 语句时,先给 i 赋初值1,判断 i<=100 是否成立;因为此时 i=1,i<=100 成立,所以执行循环体。循环体执行结束后(sum的值为1),再计算 i++。
第二次循环时,i 的值为2,i<=100 成立,继续执行循环体。循环体执行结束后(sum的值为3),再计算 i++。
重复执行步骤 2),直到第101次循环,因为此时 i 的值为101,i<=100 不成立,所以结束循环。
for 语句 vs while语句
i=1;
while(i<=100){
sum+=i;
i++;
}
由此我们可以总结出for循环的一般形式:
for(循环变量赋初值; 循环条件; 循环变量增量){
语句块
}
循环变量赋初值总是一个赋值语句,它用来给循环控制变量赋初值;循环条件是一个关系表达式,它决定什么时候退出循环;循环变量增量,定义循环控制变量每循环一次后按什么方式变化。这三个部分之间用分号;分开。
注意:
for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项,即可以缺省,但分号(;)不能缺省。
省略了“表达式1(循环变量赋初值)”,表示不对循环控制变量赋初值。
省略了“表达式2(循环条件)”,如果不做其它处理就会成为死循环。
如:
for(i=1; ; i++) sum=sum+i;
所谓死循环,就是循环条件永远为真,循环会一直进行下去,永不结束。死循环对程序的危害很大,一定要避免。
- 省略了“表达式3(循环变量增量)”,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。
如:
for( i=1; i<=100; ){
sum=sum+i;
i++;
}
- 省略了“表达式1(循环变量赋初值)”和“表达式3(循环变量增量)”。
如:
for( ; i<=100 ; ){
sum=sum+i;
i++;
}
- 3个表达式都可以省略。
如:
for( ; ; ) 语句
- 表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。
如:
for( sum=0; i<=100; i++ )
sum=sum+i;
- 表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。如:
for( sum=0,i=1; i<=100; i++ )
sum=sum+i;
如:
for( i=0,j=100; i<=100; i++,j-- )
k=i+j;
- 表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。
如:
for( i=0; (c=getchar())!='\n'; i+=c );
for 循环也可以嵌套
如:
#include <stdio.h>
int main(){
int i, j, k;
printf("i j k\n");
for (i=0; i<3; i++) // 循环①
for(j=0; j<3; j++) // 循环②
for(k=0; k<3; k++) // 循环③
printf("%d %d %d\n", i, j, k);
return 0;
}
大家可以自己先算算结果,然后再运行对比结果看看。