循環(huán)語句是用于重復(fù)執(zhí)行某條語句(循環(huán)體)的語句褒侧,它包含一個(gè)控制表達(dá)式,每循環(huán)執(zhí)行一次都要對控制表達(dá)式進(jìn)行判斷姨伟,如果表達(dá)式為真惩琉,則繼續(xù)執(zhí)行循環(huán)。C語言提供了3中循環(huán)語句夺荒,分別為while語句瞒渠,do while語句和for語句良蒸。
while語句
while語句是控制表達(dá)式在循環(huán)體之前的循環(huán)語句,它的格式如下:
while(表達(dá)式)
? ?語句
這里的圓括號是強(qiáng)制要求的伍玖,圓括號之內(nèi)的表達(dá)式為控制表達(dá)式嫩痰,圓括號之外的語句為循環(huán)體。
while語句的執(zhí)行步驟窍箍,首先計(jì)算控制表達(dá)式的值串纺,如果表達(dá)式的值不為0(為真),則執(zhí)行循環(huán)體椰棘,接著再次判斷控制表達(dá)式纺棺,如果其值不為0,再次執(zhí)行循環(huán)體邪狞。執(zhí)行這個(gè)步驟直到控制表達(dá)式的值為0時(shí)停止祷蝌。
結(jié)果會輸出錯(cuò)誤如下:
1到50之間(包括1和50)的整數(shù)之和為1275
如果while的控制表達(dá)式一直不為0,那么循環(huán)將一直進(jìn)行下去外恕,稱為無限循環(huán)杆逗。這樣的循環(huán)在循環(huán)體中都包含break,goto,return或者導(dǎo)致程序終止的函數(shù)(如exit等),以在適當(dāng)?shù)臅r(shí)機(jī)終止程序鳞疲。
結(jié)果會輸出錯(cuò)誤如下:
1到50之間(包括1和50)的整數(shù)之和為1275
do while語句
do while語句與while語句非常相似罪郊,只不過do while語句在每次執(zhí)行完循環(huán)體之后對控制表達(dá)式進(jìn)行判斷的,因此do while語句的循環(huán)體至少會執(zhí)行一次尚洽,而while語句的循環(huán)體可能一次都不被執(zhí)行悔橄。do while語句的格式如下:
do ?
? ?語句
while(表達(dá)式);
do while循環(huán)的執(zhí)行步驟如下:首先執(zhí)行循環(huán)體,再計(jì)算控制表達(dá)式的值腺毫,如果表達(dá)式的值非零再繼續(xù)執(zhí)行循環(huán)體癣疟,然后再次判斷表達(dá)式的值。這個(gè)過程持續(xù)進(jìn)行潮酒,知道控制表達(dá)式的值為0睛挚,終止do while語句執(zhí)行。
建議對do while的循環(huán)體都使用大括號包裹起來急黎,因?yàn)榇罄ㄌ枙筪o while語句被誤認(rèn)為是while語句扎狱。
結(jié)果會輸出:
1到50之間(包括1和50)的整數(shù)之和為1275
for語句
for語句的格式如下:
for(表達(dá)式1;表達(dá)式2勃教;表達(dá)式3)
? ? 語句
for語句的執(zhí)行步驟是:首先執(zhí)行表達(dá)式1進(jìn)行初始化淤击,然后判斷表達(dá)式2的值是否為真,若為真故源,則執(zhí)行循環(huán)體污抬,然后執(zhí)行表達(dá)式3.隨后再次對表達(dá)式2的值進(jìn)行判斷,若為真绳军,則再次執(zhí)行循環(huán)體和表達(dá)式3印机,依次循環(huán)直到表達(dá)式2的值為0為止矢腻。
for語句的3個(gè)表達(dá)式都可以省略,若省略表達(dá)式1耳贬,則在執(zhí)行循環(huán)前沒有初始化的操作踏堡;若省略第三個(gè)表達(dá)式,則執(zhí)行完循環(huán)體后咒劲,沒有再需要執(zhí)行的語句顷蟆,循環(huán)體確保循環(huán)能夠在有限時(shí)間內(nèi)終止;若省略第二個(gè)表達(dá)式腐魂,則每次判斷都默認(rèn)為真帐偎,除非在循環(huán)體內(nèi)使用break,goto和程序終止函數(shù)外,循環(huán)不會停止蛔屹。
結(jié)果輸出如下:
1到50之間(包括1和50)的整數(shù)之和為1275
現(xiàn)在我們來看一道例題:
電梯在城市的高層建筑中廣泛應(yīng)用削樊。輸入電梯停靠樓層的列表兔毒,以0結(jié)束輸入漫贞,計(jì)算電梯到達(dá)最后樓層需要花費(fèi)的時(shí)間。列表中的數(shù)字表示電梯將在哪一層陀靠迅脐,電梯按照列表順序依次停靠豪嗽。假設(shè)電梯每上行一層需要花6秒時(shí)間谴蔑,每下行一層需要花費(fèi)4秒時(shí)間,電梯每停一次需要5秒龟梦。
方法一:
#include
int main(void)
{
int i,number,n=0,tm;
int *p,ft[100];
printf("Please input floors(Ends with 0): ");
scanf("%d",&number);
//輸入樓層列表隐锭,以0結(jié)束。
while(number != 0)
{
ft[n]=number;
n++;
scanf("%d",&number);//循環(huán)輸入
}
tm=0;
p=ft;
for(i=0;i
{
if(*p<*(p+1))
tm=tm+(*(p+1)-*p)*6+5;
else
tm=tm+(*p-*(p+1))*4+5;
p++;
}
printf("The time is%d ",tm);
return 0;
}
此種方法在開始先給循環(huán)輸入的變量一個(gè)初值计贰,用來滿足下面開始的循環(huán)輸入钦睡。
方法二:
#include
int main(void)
{
int i,number,n=0,tm;
int *p,ft[100];
printf("Please input floors(Ends with 0): ");
while(1)//使用死循環(huán)輸入
{
scanf("%d",&number);
if(number==0)
break;
ft[n]=number;
n++;
}
tm=0;
p=ft;
for(i=0;i
{
if(*p<*(p+1))
tm=tm+(*(p+1)-*p)*6+5;
else
tm=tm+(*p-*(p+1))*4+5;
p++;
}
printf("The time is%d ",tm);
return 0;
}
此種方法先是進(jìn)入死循環(huán),開始輸入躁倒,當(dāng)輸入滿足題目所需條件時(shí)赎婚,可以退出循環(huán)。但是必須要在每次讀入下一個(gè)值之前先判斷是否滿足退出條件樱溉,否則會多讀入一個(gè)值。
這是正確的結(jié)果纬凤,當(dāng)判斷語句放到最后時(shí)福贞,結(jié)果便會出錯(cuò),下面是出錯(cuò)代碼和結(jié)果停士。
這個(gè)結(jié)果是把0當(dāng)作一層樓給讀入了挖帘,然后把2層到0層的時(shí)間計(jì)入完丽,導(dǎo)致錯(cuò)誤。
循環(huán)體中的跳轉(zhuǎn)語句
在循環(huán)體中可以使用break拇舀,continue和goto跳轉(zhuǎn)語句逻族。
break語句。
break語句在循環(huán)體的中間設(shè)置退出點(diǎn)骄崩,用以跳出while聘鳞,do while和for循環(huán),直接執(zhí)行循環(huán)語句后面的語句要拂。除此之外抠璃,break語句還用于switch語句,用以跳出switch語句而直接執(zhí)行switch語句后面的語句脱惰。對于嵌套的循環(huán)語句和(或)switch語句搏嗡,break只能跳過其所在的那層循環(huán)或switch語句。
continue語句拉一。
continue語句并不跳出循環(huán)采盒,而是將程序執(zhí)行正好轉(zhuǎn)移到循環(huán)體末尾處,跳過本次循環(huán)中循環(huán)體余下的內(nèi)容蔚润。continue語句只能用于循環(huán)體中磅氨。
結(jié)果輸出:
以上十個(gè)非零數(shù)的和為:55
goto語句。
goto語句不僅可以用在循環(huán)體中抽碌,還可以用在程序的任何位置悍赢。與continue和break不同,它可以跳轉(zhuǎn)到同一個(gè)函數(shù)中任何有標(biāo)記的語句處货徙。goto依賴于定義在語句開頭的標(biāo)識符左权,其形式為:標(biāo)識符 : 語句。goto語句的形式為:goto 標(biāo)識符;
goto易于造成程序混亂痴颊,代碼難以閱讀赏迟,并且其他跳轉(zhuǎn)語句、return和exit語句能夠滿足大多數(shù)需要goto語句的情況蠢棱。除非萬不得已锌杀,盡量不要使用。
結(jié)果輸出:
0小于4
1小于4
2小于4
3小于4
i開始不小于4
結(jié)束語
每天進(jìn)步一點(diǎn)點(diǎn)泻仙,每天消化一點(diǎn)點(diǎn)糕再。如果你有更高的想法,歡迎一起交流玉转。如果覺得文章寫得還不錯(cuò)突想,點(diǎn)個(gè)贊唄。