for語句是C語言所提供的功能更強,使用更廣泛的一種循環(huán)語句。其一般形式為: for(表達式1;表達式2;表達3) 語句; 表達式1 通常用來給循環(huán)變量賦初值,一般是賦值表達式。也允許在for語句外給循環(huán)變量賦初值,此時可以省略該表達式。 表達式2 通常是循環(huán)條件,一般為關系表達式或邏輯表達式。 表達式3 通??捎脕硇薷难h(huán)變量的值,一般是賦值語句。 這三個表達式都可以是逗號表達式,即每個表達式都可由多個表達式組成。三個表達式都是任選項,都可以省略。 一般形式中的“語句”即為循環(huán)體語句。for語句的語義是: 1.首先計算表達式1的值。 2.再計算表達式2的值,若值為真(非0)則執(zhí)行循環(huán)體一次,否則跳出循環(huán)。 3.然后再計算表達式3的值,轉(zhuǎn)回第2步重復執(zhí)行。在整個for循環(huán)過程中,表達式1只計算一次,表達式2和表達式,3則可能計算多次。循環(huán)體可能多次執(zhí)行,也可能一次都不執(zhí)行。for 語句的執(zhí)行過程如圖所示。 void main(){ int n,s=0; for(n=1;n<=100;n++) s=s+n; printf("s=%d\n",s); } 用for語句計算s=1+2+3+...+99+100 int n,s=0; for(n=1;n<=100;n++) s=s+n; printf("s=%d\n",s); 本例for語句中的表達式3為n++,實際上也是一種賦值語句,相當于n=n+1,以改變循環(huán)變量的值。 void main(){ int a=0,n; printf("\n input n: "); scanf("%d",&n); for(;n>0;a++,n--) printf("%d ",a*2); } 用for語句修改例題。從0開始,輸出n個連續(xù)的偶數(shù)。 int a=0,n; printf("\n input n: "); scanf("%d",&n); for(;n>0;a++,n--) printf("%d ",a*2); 本例的for語句中,表達式1已省去,循環(huán)變量的初值在for語句之前由scanf語句取得,表達式3是一個逗號表達式,由a++,n-- 兩個表達式組成。每循環(huán)一次a自增1,n自減1。a的變化使輸出的偶數(shù)遞增,n的變化控制循次數(shù)。 在使用for語句中要注意以下幾點 1.for語句中的各表達式都可省略,但分號間隔符不能少。如:for(;表達式;表達式)省去了表達式1。for(表達式;;表達式)省去了表達式2。 for(表達式;表達式;)省去了表達式3。for(;;)省去了全部表達式。 2.在循環(huán)變量已賦初值時,可省去表達式1,如例3.27即屬于這種情形。如省去表達式2或表達式3則將造成無限循環(huán),這時應在循環(huán)體內(nèi)設法結束循環(huán)。例題即屬于此情況。 void main(){ int a=0,n; printf("\n input n: "); scanf("%d",&n); for(;n>0;) { a++;n--; printf("%d ",a*2); } } 本例中省略了表達式1和表達式3,由循環(huán)體內(nèi)的n--語句進行循環(huán)變量n的遞減,以控制循環(huán)次數(shù)。 void main(){ int a=0,n; printf("\n input n: "); scanf("%d",&n); for(;;){ a++;n--; printf("%d ",a*2); if(n==0)break; } } 本例中for語句的表達式全部省去。由循環(huán)體中的語句實現(xiàn)循環(huán)變量的遞減和循環(huán)條件的判斷。當n值為0時,由break語句中止循環(huán),轉(zhuǎn)去執(zhí)行for以后的程序。在此情況下,for語句已等效于while( 1)語句。如在循環(huán)體中沒有相應的控制手段,則造成死循環(huán)。
3.循環(huán)體可以是空語句。 #include"stdio.h" void main(){ int n=0; printf("input a string:\n"); for(;getchar()!='\n';n++); printf("%d",n); } 本例中,省去了for語句的表達式1,表達式3也不是用來修改循環(huán)變量,而是用作輸入字符的計數(shù)。這樣,就把本應在循環(huán)體中完成的計數(shù)放在表達式中完成了。因此循環(huán)體是空語句。應注意的是,空語句后的分號不可少,如缺少此分號,則把后面的printf 語句當成循環(huán)體來執(zhí)行。反過來說,如循環(huán)體不為空語句時,決不能在表達式的括號后加分號,這樣又會認為循環(huán)體是空語句而不能反復執(zhí)行。這些都是編程中常見的錯誤,要十分注意。
4.for語句也可與while,do-while語句相互嵌套,構成多重循環(huán)。以下形成都合法的嵌套。 (1)for(){… while() {…} … } (2)do{ … for() {…} … }while(); (3)while(){ … for() {…} … } (4)for(){ … for(){ … } } void main(){ int i,j,k; for(i=1;i<=3;i++) { for(j=1;j<=3-i+5;j++) printf(" "); for(k=1;k<=2*i-1+5;k++) { if(k<=5) printf(" "); else printf("*"); } printf("\n"); } }
for語句是最靈活也是最常用的循環(huán)結構。Java主要提供了兩種形式的for語句:數(shù)值型for循環(huán)和基于集合的for循環(huán)。 1. 數(shù)值型for循環(huán)數(shù)值型for循環(huán)的一般形式為: for(表達式1;表達式2;表達式3) 語句; 在關鍵字for后的括號內(nèi)有3個表達式語句,其中表達式1和表達式3可以是任意表達式語句或空語句,甚至是逗號表達式;表達式2必須為boolean型的常量、變量或表達式。它的執(zhí)行過程如圖5-9所示,說明如下: 
(1)先求解表達式1,然后求解表達式2,若其值為真(true),則執(zhí)行for語句中內(nèi)嵌的循環(huán)語句;若其值為假(false),則轉(zhuǎn)到第5步結束循環(huán)。 (2)求解表達式3。 (3)轉(zhuǎn)回上面求解表達式2,繼續(xù)執(zhí)行。 (4)循環(huán)結束,執(zhí)行for語句下面的一個語句。 在使用數(shù)值型for循環(huán)時,常把表達式1用于初始化循環(huán)變量,表達式2是循環(huán)的判定條件,表達式3常用作循環(huán)增量表達式。其形式如下: for(初始化循環(huán)變量;循環(huán)條件;循環(huán)變量增量) 語句; 如例2.6求1×2×3×4×5,其算法實現(xiàn)如下: 【例5.8】
程序執(zhí)行結果如下: 1×2×3×4×5=120 使用注意事項: (1)for循環(huán)中的表達式1(循環(huán)變量初始化)、表達式2(循環(huán)條件)和表達式3(循環(huán)變量增量)都是可選項, 即可為空語句,但“;”不能缺省。 省略了“表達式1(循環(huán)變量初始化)”,表示不對循環(huán)控制變量初始化。循環(huán)變量的初始化工作可置于for循環(huán)之前。 省略了“表達式2(循環(huán)條件)”,則for循環(huán)將成為死循環(huán),不停的執(zhí)行循環(huán)體。如: for(int i=2; ;i++) { t= t*i; } 相當于: for(int i=2;true;i++) { t= t*i; } 省略了“表達式3(循環(huán)變量增量)”,則不對循環(huán)控制變量進行操作,這時可在語句體中加入修改循環(huán)控制變量的語句。如: for(int i=2;i<=5 ;i++) { t= t*i; } 相當于: for(int i=2;i<=5;) { t= t*i; i++; } 省略了“表達式1(循環(huán)變量初始化)”和“表達式3(循環(huán)變量增量)”。如: for(int i=2;i<=5 ;i++) { t= t*i; } 相當于: int i=2; for(;i<=5;) { t= t*i; i++; } 當然,3個表達式可以同時省略。如: for(int i=2;i<=5 ;i++) { t= t*i; } 相當于: int i=2; for(;;) { t = t*i; i++; if(i<=5) break; //如果i<=5,則跳出循環(huán)體。 } (2)表達式1和表達式3可以是一個簡單表達式也可以是逗號表達式。如: int t=1; for(int i=2;i<=5;i++) { t= t*i; } 相當于: int t,i; for(t=1,i=2;i<=5;t=t*i,i++); //該語句雖簡潔,但不夠清晰,建議程序中不要這么寫。 2. 基于集合的for循環(huán) 基于集合的for循環(huán)是在JDK5.0版本之后,為簡化集合類、枚舉和數(shù)組的迭代過程而提出來的。其一般形式如下: for(類型 標識符:可迭代的表達式) 語句; 在關鍵字for后的括號中有兩個控制元素,它們之間用一個冒號“:”分隔開。第一個元素用于指定的一個類型標識符;而第二個元素指定了一個可迭代的表達式(結果通常是集合或數(shù)組)。第一個元素指定的類型標識符其類型應與集合或數(shù)組中存放的對象相兼容。它的語義可描述如下,其流程如圖5-10所示。

類型 標識符 =null; for(int i=0; i<可迭代表達式結果長度; i++) { 標識符 = 可迭代表達式結果.get(i); 語句; } 集合類和枚舉將在后面章節(jié)詳細介紹,這里舉個在數(shù)組中運用的例子。如例2.9有50個學生,要求將他們之中成績在80分以上者打印出來。 【例5.9】
基于集合的for循環(huán),在遍歷集合對象時能使程序更加簡潔。但因其隱藏了循環(huán)變量,當執(zhí)行過程中需引用數(shù)組下標或迭代器時,將會變得復雜些。
|