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;
}
大家可以自己先算算結果,然后再運行對比結果看看。