do-while語(yǔ)句
do-while語(yǔ)句的一般形式為:
do
語(yǔ)句;
while(表達(dá)式);
其中語(yǔ)句是循環(huán)體,表達(dá)式是循環(huán)條件。
do-while語(yǔ)句的語(yǔ)義是:
先執(zhí)行循環(huán)體語(yǔ)句一次, 再判別表達(dá)式的值,若為真(非0)則繼續(xù)循環(huán),否則終止循環(huán)。
do-while語(yǔ)句和while語(yǔ)句的區(qū)別在于do-while是先執(zhí)行后判斷,因此do-while至少要執(zhí)行一次循環(huán)體。而while是先判斷后執(zhí)行,如果條件不滿足,則一次循環(huán)體語(yǔ)句也不執(zhí)行。
while語(yǔ)句和do-while語(yǔ)句一般都可以相互改寫(xiě)。
void main(){
int a=0,n;
printf("\n input n: ");
sCanf("%d",&n);
do printf("%d ",a++*2);
while (--n);
}
在本例中,循環(huán)條件改為--n,否則將多執(zhí)行一次循環(huán)。這是由于先執(zhí)行后判斷而造成的。
對(duì)于do-while語(yǔ)句還應(yīng)注意以下幾點(diǎn):
1.在if語(yǔ)句,while語(yǔ)句中, 表達(dá)式后面都不能加分號(hào), 而在 do-while語(yǔ)句的表達(dá)式后面則必須加分號(hào)。
2.do-while語(yǔ)句也可以組成多重循環(huán),而且也可以和while語(yǔ)句相互嵌套。
3.在do和while之間的循環(huán)體由多個(gè)語(yǔ)句組成時(shí),也必須用{}括起來(lái)組成一個(gè)復(fù)合語(yǔ)句。
4.do-while和while語(yǔ)句相互替換時(shí),要注意修改循環(huán)控制條件。
for語(yǔ)句
for語(yǔ)句是C語(yǔ)言所提供的功能更強(qiáng),使用更廣泛的一種循環(huán)語(yǔ)句。其一般形式為:
for(表達(dá)式1;表達(dá)式2;表達(dá)3)
語(yǔ)句;
表達(dá)式1 通常用來(lái)給循環(huán)變量賦初值,一般是賦值表達(dá)式。也允許在for語(yǔ)句外給循環(huán)變量賦初值,此時(shí)可以省略該表達(dá)式。
表達(dá)式2 通常是循環(huán)條件,一般為關(guān)系表達(dá)式或邏輯表達(dá)式。
表達(dá)式3 通?捎脕(lái)修改循環(huán)變量的值,一般是賦值語(yǔ)句。
這三個(gè)表達(dá)式都可以是逗號(hào)表達(dá)式, 即每個(gè)表達(dá)式都可由多個(gè)表達(dá)式組成。三個(gè)表達(dá)式都是任選項(xiàng),都可以省略。
一般形式中的“語(yǔ)句”即為循環(huán)體語(yǔ)句。for語(yǔ)句的語(yǔ)義是:
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)過(guò)程中,表達(dá)式1只計(jì)算一次,表達(dá)式2和表達(dá)式,3則可能計(jì)算多次。循環(huán)體可能多次執(zhí)行,也可能一次都不執(zhí)行。for 語(yǔ)句的執(zhí)行過(guò)程如圖所示。
void main(){
int n,s=0;
for(n=1;n<=100;n++)
s=s+n;
printf("s=%d\n",s);
}
用for語(yǔ)句計(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語(yǔ)句中的表達(dá)式3為n++,實(shí)際上也是一種賦值語(yǔ)句,相當(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語(yǔ)句修改例題。從0開(kāi)始,輸出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語(yǔ)句中,表達(dá)式1已省去,循環(huán)變量的初值在for語(yǔ)句之前由sCanf語(yǔ)句取得,表達(dá)式3是一個(gè)逗號(hào)表達(dá)式,由a++,n-- 兩個(gè)表達(dá)式組成。每循環(huán)一次a自增1,n自減1。a的變化使輸出的偶數(shù)遞增,n的變化控制循次數(shù)。
在使用for語(yǔ)句中要注意以下幾點(diǎn)
1.for語(yǔ)句中的各表達(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則將造成無(wú)限循環(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--語(yǔ)句進(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語(yǔ)句的表達(dá)式全部省去。由循環(huán)體中的語(yǔ)句實(shí)現(xiàn)循環(huán)變量的遞減和循環(huán)條件的判斷。當(dāng)n值為0時(shí),由break語(yǔ)句中止循環(huán),轉(zhuǎn)去執(zhí)行for以后的程序。在此情況下,for語(yǔ)句已等效于while( 1)語(yǔ)句。如在循環(huán)體中沒(méi)有相應(yīng)的控制手段,則造成死循環(huán)。
3.循環(huán)體可以是空語(yǔ)句。
#inClude"stdio.h"
void main(){
int n=0;
printf("input a string:\n");
for(;getChar()!=’\n’;n++);
printf("%d",n);
}
本例中,省去了for語(yǔ)句的表達(dá)式1,表達(dá)式3也不是用來(lái)修改循環(huán)變量,而是用作輸入字符的計(jì)數(shù)。這樣, 就把本應(yīng)在循環(huán)體中完成的計(jì)數(shù)放在表達(dá)式中完成了。因此循環(huán)體是空語(yǔ)句。應(yīng)注意的是,空語(yǔ)句后的分號(hào)不可少,如缺少此分號(hào),則把后面的printf 語(yǔ)句當(dāng)成循環(huán)體來(lái)執(zhí)行。反過(guò)來(lái)說(shuō),如循環(huán)體不為空語(yǔ)句時(shí), 決不能在表達(dá)式的括號(hào)后加分號(hào), 這樣又會(huì)認(rèn)為循環(huán)體是空語(yǔ)句而不能反復(fù)執(zhí)行。這些都是編程中常見(jiàn)的錯(cuò)誤,要十分注意。
4.for語(yǔ)句也可與while,do-while語(yǔ)句相互嵌套,構(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");
}
}
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |