C語言學(xué)習(xí)之四——循環(huán)控制結(jié)構(gòu)程序

  1. 循環(huán)結(jié)構(gòu):在給定條件成立時(shí),反復(fù)執(zhí)行某程序段,直到條件不成立為止。給定的條件稱為循環(huán)條件, 反復(fù)執(zhí)行的程序段稱為循環(huán)體。
    C語言中有4中形式的循環(huán)結(jié)構(gòu):1)用goto語句和if語句構(gòu)成循環(huán); 2)while語句; 3)do-while語句; 4)for語句击吱。

  2. goto語句:是一種無條件轉(zhuǎn)移的語句(即碰到goto窒所,立馬轉(zhuǎn)到程序中含有g(shù)oto后面的標(biāo)志符號的位置)
    goto語句形式: goto 語句標(biāo)號;

//例
/#include<stdio.h>
void main()
{
int i,sum=0;
i=1;
loop: if (i<=100) //注意這里語句標(biāo)號loop后面有“:”宫仗,只有“語句標(biāo)號”+ “:”組合才能表示跳轉(zhuǎn)到該語句并執(zhí)行后面語句
{
sum=sum+i;
i++;
goto loop; //這里的loop可以替換為任意合法字母
}
printf("%d\n",sum);
}
//輸出:5050
(注:goto的使用必須在一個(gè)函數(shù)體內(nèi)執(zhí)行彻坛,但可以在不同循環(huán)層中。goto語句往往與if條件語句連用荐虐,當(dāng)遇到goto語句時(shí)七兜,先跳轉(zhuǎn)到goto后面的語句標(biāo)號所標(biāo)志的部位(goto語句是一種無條件轉(zhuǎn)移的語句),當(dāng)滿足if條件時(shí)福扬,執(zhí)行if后面的語句腕铸,否則跳過if語句)

注意:goto語句通常不用,主要因素是因?yàn)樗鼘⑹钩绦驅(qū)哟尾磺?且不易讀,但在多層嵌套退出時(shí), 用goto語句則比較合理。

  1. while 循環(huán)
    一般形式:while(表達(dá)式) 語句
    while循環(huán)語義:計(jì)算表達(dá)式的值,當(dāng)值為真(即非0)時(shí), 執(zhí)行循環(huán)體語句铛碑。


    While-循環(huán)

    注意:如果表達(dá)式的值一開始就為0,則語句一次也會被不執(zhí)行狠裹。

//例
/#include<stdio.h>
void main()
{
int i, sum=0;
i=1;
while(i<=100)
{
sum=sum+i;
i++;
}
printf("%d\n",sum);
}
//輸出:5050
(注:在while循環(huán)中必須必須在有限步內(nèi)使得while后面的表達(dá)式不成立,即表達(dá)式 == 0汽烦,這樣才能在有限步內(nèi)終止while循環(huán)涛菠,否則將陷入死循環(huán))
//例
/#include <stdio.h>
void main()
{
int n=0;
printf("input a string:\n");
while( getchar()!='\n' )
{
n++;
}
printf("%d",n);
}
//輸出:input a string:
//輸入:bd123hgk\n
//輸出:8
//輸出:input a string:
//輸入:adfghjk133\n
//輸出:10

使用while循環(huán)的注意事項(xiàng):
1)while循環(huán)中的表達(dá)式一般是關(guān)系表達(dá)式或邏輯表達(dá)式(輸出0或1用以判定真假),只要表達(dá)式的值為真(非0)即可繼續(xù)循環(huán)撇吞。(當(dāng)然俗冻,這里的表達(dá)式也可以為其他類型的表達(dá)式,但是需要注意牍颈,例如while(a = 0){...}則不會執(zhí)行大括號后面的語句迄薄;例如,while(a = 11){...}則會陷入死循環(huán))
2)循環(huán)體如包括有一個(gè)以上的語句,則必須用大括號{}括起來,組成復(fù)合語句颂砸。

  1. do-while 循環(huán)


    Do-while循環(huán)

do-while循環(huán)與while循環(huán)的不同在于:它先執(zhí)行循環(huán)中的語句,然后再判斷表達(dá)式是否為真, 如果為真則繼續(xù)循環(huán);如果為假, 則終止循環(huán)噪奄。因此, do-while循環(huán)至少要執(zhí)行一次循環(huán)語句死姚。

//例
/#include<stdio.h>
void main()
{
int i,sum=0;
i=1;
do
{
sum=sum+i;
i++;
}while(i<=100)
printf("%d\n",sum);
}
//輸出:5050

  1. for循環(huán)
    在C語言中,for語句的使用是最為靈活,它完全可以取代 while 語句人乓。
    for循環(huán)一般形式為:for(表達(dá)式1; 表達(dá)式2; 表達(dá)式3) 語句;
    它的執(zhí)行過程如下:
    1)先求解表達(dá)式1。
    2)求解表達(dá)式2,若其值為真(非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第3)步;若其值為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第5)步都毒。
    3)求解表達(dá)式3色罚。
    4)轉(zhuǎn)回上面第2)步繼續(xù)執(zhí)行。
    5)循環(huán)結(jié)束,執(zhí)行for語句下面的一個(gè)語句账劲。
    for循環(huán)可以理解為:for (循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增量) 語句 (循環(huán)變量賦初值總是一個(gè)賦值語句, 它用來給循環(huán)控制變量賦初值; 循環(huán)條件是一個(gè)關(guān)系表達(dá)式,它決定什么時(shí)候退出循環(huán);循環(huán)變量增量, 定義循環(huán)控制變量每循環(huán)一次后按什么方式變化戳护。這三個(gè)部分之間用“;”分開金抡。)

//例
for (i = 0; I <= 100; i++)
{
sum = sum + i;
}

使用for循環(huán)的注意事項(xiàng):
1)for循環(huán)中的“表達(dá)式1(循環(huán)變量賦初值)”、“表達(dá)式2(循環(huán)條件)”和“表達(dá)式3(循環(huán)變量增量)”都是選擇項(xiàng), 即可以缺省,但“;”不能缺省腌且。
2)省略了“表達(dá)式1(循環(huán)變量賦初值)”, 表示不對循環(huán)控制變量賦初值梗肝。(則需要在for循環(huán)之前對變量賦初值)
3)省略了“表達(dá)式2(循環(huán)條件)”, 則不做其它處理時(shí)便成為死循環(huán)。
4)省略了“表達(dá)式3(循環(huán)變量增量)”, 則不對循環(huán)控制變量進(jìn)行操作,這時(shí)可在語句體中加入修改循環(huán)控制變量的語句铺董。

//例如:
for(i=1; i<=100; )
{
sum = sum + i;
i++;
}

5)省略了“表達(dá)式1(循環(huán)變量賦初值)”和“表達(dá)式3(循環(huán)變量增量)”巫击。

//例如:
for( ; i<=100; ) //(需要在for循環(huán)之前對變量i賦初值)
{
sum = sum + i;
i++;
}

6)3個(gè)表達(dá)式都可以省略。例如:for(;;)語句精续, 相當(dāng)于:while(1)語句
7)表達(dá)式1可以是設(shè)置循環(huán)變量的初值的賦值表達(dá)式,也可以是其他表達(dá)式坝锰。
例如:for (sum=0; i<=100; i++) sum=sum+i;
8)表達(dá)式1和表達(dá)式3可以是一個(gè)簡單表達(dá)式也可以是逗號表達(dá)式。
for(sum=0,i=1; i<=100; i++) sum=sum+i; 或: for(i=0,j=100; i<=100; i++,j--) k=i+j;
9)表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可是數(shù)值表達(dá)式或字符表達(dá)式,只要其值非零重付,就執(zhí)行循環(huán)體顷级。

//例如:
for(i=0;(c=getchar())!=’\n’;i+=c);
//又如:
for (; (c=getchar())!=’\n’; )
{
printf(“%c”,c);
}

  1. 幾種循環(huán)的比較
    (1)四種循環(huán)都可以用來處理同一問題,一般情況下它們可以互相代替。但一般不提倡用goto型循環(huán)确垫。
    (2) 在while循環(huán)和do-while循環(huán)中,只在while后面的括號內(nèi)指定循環(huán)條件,因此為了使循環(huán)能正常結(jié)束,應(yīng)在循環(huán)體中包含使循環(huán)趨于結(jié)束的語句(如i++,或i=i+1等)弓颈。
    for循環(huán)可以在表達(dá)式3中包含使循環(huán)趨于結(jié)束的操作,甚至可以將循環(huán)體中的操作全部放到表達(dá)式3中。因此for語句的功能更強(qiáng)删掀,凡是用while循環(huán)能完成的,用for循環(huán)都能實(shí)現(xiàn)恨豁。

//例
/#include<stdio.h>
void main()
{
int i, sum;
for(i = 1, sum = 0 ; i <= 101; sum += i, i++) ;
printf("%d\n", sum);
}

//輸出:5151

(3)用while和do-while循環(huán)時(shí),循環(huán)變量初始化的操作應(yīng)在while和do-while語句之前完成而for語句可以在表達(dá)式1中實(shí)現(xiàn)循環(huán)變量的初始化。
(4)while循環(huán)爬迟、do-while循環(huán)和for循環(huán),可以用break語句跳出循環(huán),用continue語句結(jié)束本次循環(huán)橘蜜。而對用goto語句和if語句構(gòu)成的循環(huán),不能用break語句和continue語句進(jìn)行控制。
  1. break語句和continue語句
    break語句:可以用來從循環(huán)體內(nèi)跳出循環(huán)體,即提前結(jié)束循環(huán)付呕。
    break語句一般形式: break; (注:break語句只能用于循環(huán)語句和switch語句中)
    注意:1)break語句對if-else的條件語句不起作用计福。2)在多層循環(huán)中, 一個(gè)break語句只向外跳一層。

//例
/#include<stdio.h>
void main()
{
float pi = 3.14159;
float r, area;
r=1, area = 0;
for(; r <= 10; r++)
{
area = pirr;
if( area > 100 )
{
break;
}
printf("r=%f, area=%f\n",r, area);
}
}
//輸出: r=1.000000, area=3.141590
r=2.000000, area=12.566360
r=3.000000, area=28.274311
r=4.000000, area=50.265442
r=5.000000,area=78.539749
//程序的作用是計(jì)算r=1到r=10時(shí)的圓面積,直到面積area大于100為止徽职。從上面的for循環(huán)可以看到:當(dāng)area>100時(shí),執(zhí)行break語句,提前結(jié)束循環(huán),即不再繼續(xù)執(zhí)行其余的幾次循環(huán)象颖。

continue語句:作用為結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定。
continue語句一般形式: continue;

//例
/#include<stdio.h>
void main()
{
int i;
for(i = 0; i <= 10; i++)
{
if( i % 2 == 0 ) continue;
printf("odd = %d, ",i);
}
}
//輸出:odd = 1 odd = 3 odd = 5 odd = 7 odd = 9

continue語句和break語句的區(qū)別:continue語句只結(jié)束本次循環(huán),而不是終止整個(gè)循環(huán)的執(zhí)行姆钉;break語句則是結(jié)束整個(gè)循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立说订。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市潮瓶,隨后出現(xiàn)的幾起案子陶冷,更是在濱河造成了極大的恐慌,老刑警劉巖毯辅,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埂伦,死亡現(xiàn)場離奇詭異,居然都是意外死亡思恐,警方通過查閱死者的電腦和手機(jī)沾谜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門膊毁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人基跑,你說我怎么就攤上這事婚温。” “怎么了媳否?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵缭召,是天一觀的道長。 經(jīng)常有香客問我逆日,道長嵌巷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任室抽,我火速辦了婚禮搪哪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坪圾。我一直安慰自己晓折,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布兽泄。 她就那樣靜靜地躺著漓概,像睡著了一般。 火紅的嫁衣襯著肌膚如雪病梢。 梳的紋絲不亂的頭發(fā)上胃珍,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音蜓陌,去河邊找鬼觅彰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钮热,可吹牛的內(nèi)容都是我干的填抬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼隧期,長吁一口氣:“原來是場噩夢啊……” “哼飒责!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仆潮,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宏蛉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鸵闪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檐晕,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年蚌讼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辟灰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篡石,死狀恐怖芥喇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凰萨,我是刑警寧澤继控,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站胖眷,受9級特大地震影響武通,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜珊搀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一冶忱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧境析,春花似錦囚枪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沛鸵,卻和暖如春括勺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曲掰。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工朝刊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜈缤。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓拾氓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親底哥。 傳聞我的和親對象是個(gè)殘疾皇子咙鞍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容