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

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