作者 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)雕擂。
轉(zhuǎn)載請注明出處壮韭。
原文:http://www.reibang.com/p/9193259c0724
《C語言探索之旅》全系列
內(nèi)容簡介
- 前言
- 循環(huán)是什么
- while 循環(huán)
- do...while 循環(huán)
- for 循環(huán)
- 總結(jié)
- 第一部分第十課預(yù)告
1. 前言
上一課是 C語言探索之旅 | 第一部分第八課:條件表達(dá)式 。
下一課我們就要一起編寫第一個(gè) C語言的小程序啦员串,激動(dòng)嗎?那就快點(diǎn)把今天這課學(xué)完吧昼扛。
循環(huán)寸齐,是什么呢?
簡單地說:循環(huán)使你能夠重復(fù)執(zhí)行同樣的指令抄谐。
放輕松渺鹦,這一課的內(nèi)容相對比較簡單,不像之前的【變量】和【條件表達(dá)式】那么難以消化蛹含,所以好好享受這一課吧毅厚。因?yàn)榈诙糠志鸵_始難起來咯!
2. 循環(huán)是什么
循環(huán)是一種結(jié)構(gòu)挣惰,使指令可以被執(zhí)行多次卧斟。
與 條件語句/條件表達(dá)式 類似,循環(huán)語句也有幾種形式憎茂。但是至終珍语,目的仍然是一樣的:多次執(zhí)行同樣的指令。
我們一起來看看 C語言中常用的三種循環(huán):
- while 循環(huán)
- do...while 循環(huán)
- for 循環(huán)
這三種循環(huán)的基本原理都是一樣的竖幔,如下圖所示:
上圖中板乙,依次進(jìn)行的是:
- 電腦從上到下執(zhí)行各條指令,像往常一樣拳氢。
- 執(zhí)行完最后一條命令募逞,重新回到第一條命令,從上往下開始執(zhí)行馋评。
- 如此周而復(fù)始放接。
上圖中存在的問題是:如果我們不停止循環(huán),那么電腦是有能力一直執(zhí)行下去的(“我一路向北留特,離開有你的季節(jié)纠脾,方向盤周圍,回轉(zhuǎn)著我的后悔” -- 歌詞來自周杰倫的歌曲《一路向北》)蜕青。
是的苟蹈,我們的電腦兄不像有些人,它是從來不抱怨的右核,叫它干什么就干什么慧脱,這也是我們喜歡它的原因。
永不停止的循環(huán)有一個(gè)術(shù)語叫“死循環(huán)”贺喝,陷入死循環(huán)的電腦很容易卡機(jī)菱鸥,這也是程序員經(jīng)常抱怨的問題之一宗兼。
怎么能夠讓循環(huán)停下來呢?
聰明的讀者已經(jīng)想到了:條件表達(dá)式 采缚。
對了针炉,上一課我們學(xué)了條件表達(dá)式,現(xiàn)在到它派用場的時(shí)候了扳抽。
事實(shí)上篡帕,我們創(chuàng)建循環(huán)語句的時(shí)候,總會(huì)給它一個(gè)條件贸呢,這個(gè)條件指明:在條件為真時(shí)镰烧,才繼續(xù)執(zhí)行循環(huán),否則停止楞陷。
下面我們就來看看第一種循環(huán):while 循環(huán)怔鳖。
3. while 循環(huán)
while 循環(huán)的結(jié)構(gòu)是這樣的:
while (/* 條件 */)
{
// 重復(fù)執(zhí)行的指令
}
不難理解吧,while 在英語中是“當(dāng)...時(shí)”固蛾,即是說:
當(dāng)括號(hào)里的“條件”為真時(shí)结执,執(zhí)行大括號(hào)里的指令,一旦條件變?yōu)榧侔粓?zhí)行指令献幔,while 循環(huán)結(jié)束。
用一個(gè)小程序來看一下吧趾诗,這個(gè)程序中蜡感,我們要讓用戶輸入數(shù)字 27,只有當(dāng)用戶輸入的是 27 時(shí)恃泪,程序才會(huì)停止郑兴,否則會(huì)一直讓用戶輸入數(shù)字(是的,我很任性):
#include <stdio.h>
int main(int agrc, char *argv[]) {
int number = 0;
while (number != 27) {
printf("請輸入 27 ! ");
scanf("%d", &number);
}
return 0;
}
運(yùn)行程序贝乎,會(huì)如下顯示:
請輸入 27 ! 10
請輸入 27 ! 17
請輸入 27 ! 30
請輸入 27 ! 27
接下來情连,我們用 while 循環(huán)來做一點(diǎn)更有意思的事情:讓循環(huán)執(zhí)行一定次數(shù) 。
int counter = 0;
while (counter < 10) {
printf("你好 !\n");
counter++;
}
它會(huì)顯示 10 次“你好!”览效,如下:
你好!
你好!
你好!
你好!
你好!
你好!
你好!
你好!
你好!
你好!
邏輯到底是怎么樣的呢蒙具?
counter 初始值為 0 。
我們的 while 循環(huán)的循環(huán)條件是 counter < 10朽肥,也就是說,只有在 counter 變量的值小于 10 的時(shí)候持钉,才會(huì)執(zhí)行循環(huán)體(大括號(hào)里)的指令:打印“你好!”衡招。
因?yàn)槌跏?counter 是 0,循環(huán)條件為真每强,所以執(zhí)行 printf始腾,顯示“你好!” 州刽。
在循環(huán)體中,我們將 counter 的值加 1 浪箭。
第二次判斷條件的時(shí)候穗椅,counter 的值已經(jīng)是 1 了,但還是滿足 counter < 10 這個(gè)條件奶栖,因此再次顯示“你好!”匹表。
如此這般,一直到 counter 的值變?yōu)?10宣鄙,不滿足 counter < 10 這個(gè)條件了袍镀,while 循環(huán)才結(jié)束,所以一共打印了十個(gè)“你好!”冻晤。
為了加深理解苇羡,我們再來寫一個(gè)小程序,這次我們讓 while 循環(huán)每次輸出變量的值:
int counter = 0;
while (counter < 10) {
printf("變量的值是 %d\n", counter);
counter++;
}
執(zhí)行程序鼻弧,顯示如下:
變量的值是 0
變量的值是 1
變量的值是 2
變量的值是 3
變量的值是 4
變量的值是 5
變量的值是 6
變量的值是 7
變量的值是 8
變量的值是 9
這下是否理解得更透徹了设江?
4. do...while 循環(huán)
do 表示“做”。
這種類型和 while 循環(huán)非常類似攘轩,不過比較少用到叉存。
與 while 循環(huán)唯一的不同點(diǎn)就是循環(huán)條件的位置,while 循環(huán)中循環(huán)條件是在一開始撑刺,而 do...while 循環(huán)中是在最后:
int counter = 0;
do {
printf("你好 !\n");
counter++;
} while (counter < 10);
這樣的不同改變了什么呢鹉胖?
很簡單,while 循環(huán)可能會(huì)一次也不執(zhí)行循環(huán)體(大括號(hào)里)的指令够傍,假如條件一開始就不滿足甫菠。
而 do...while 循環(huán)是先執(zhí)行循環(huán)體的指令,再做條件判斷冕屯,所以 do...while 的指令至少會(huì)被執(zhí)行一次寂诱。
如果我們將 do...while 循環(huán)中的變量 counter 初始化為 40,那么 do...while 會(huì)顯示一次“你好!”安聘,對于 while 循環(huán)痰洒,如果 counter 初始為 40,那么一次也不會(huì)顯示“你好!”
5. for 循環(huán)
for 表示“對浴韭,對于”丘喻。
理論上,for 循環(huán)可以實(shí)現(xiàn)我們想要的任何類型循環(huán)念颈。
之前已經(jīng)說過泉粉,for 循環(huán)就是另一種形式的循環(huán)而已。
之前 while 循環(huán)的例子:
int counter = 0;
while (counter < 10) {
printf("你好 !\n");
counter++;
}
以上的代碼,我們可以寫一個(gè) for 循環(huán)的版本嗡靡,它們做的是同樣的事情:
int counter;
for (counter = 0 ; counter < 10 ; counter++) {
printf("你好 !\n");
}
這兩個(gè)循環(huán)都會(huì)顯示十次“你好!”跺撼。
for 循環(huán)和 while 循環(huán)有什么區(qū)別呢?
for 循環(huán)的例子中讨彼,counter 變量并沒有在聲明的時(shí)候初始化歉井。
在 for 后面的括號(hào)中,有更多的東西(下面我們會(huì)詳述)哈误。
在循環(huán)體(大括號(hào)里的內(nèi)容)中哩至,沒有 counter++ 這個(gè)指令。
我們最感興趣的是 for 后面的括號(hào)中的內(nèi)容黑滴,因?yàn)槟且彩?for 循環(huán)吸引人的地方憨募。
可以看到括號(hào)中有三條指令,用分號(hào)(;
)分隔:
第一條指令用于初始化:在我們的情況袁辈,我們將 counter 的值初始化為 0菜谣。
第二條指令用于規(guī)定條件:和 while 循環(huán)一樣,這個(gè)條件用于判斷循環(huán)是否繼續(xù)執(zhí)行晚缩。當(dāng)這個(gè)條件為真時(shí)尾膊,for 循環(huán)才會(huì)繼續(xù)。
第三條指令用于做自增:這條指令是在循環(huán)體中的指令執(zhí)行完后才執(zhí)行的荞彼,用于更新變量的值冈敛;大多數(shù)情況下我們是做自增,當(dāng)然我們也可以做自減(
counter--
)或者增加/減少任意值(counter -= 2
) (關(guān)于自增和自減鸣皂,請回顧運(yùn)算符那一課)抓谴。
因此,for 循環(huán)的邏輯是這樣的:
括號(hào)里的第一句指令用于初始化變量寞缝,只會(huì)執(zhí)行一次癌压,之后不再執(zhí)行。
對括號(hào)里的第二句指令做判斷荆陆,如果條件為真滩届,則執(zhí)行循環(huán)體(大括號(hào)里)的指令;如果為假被啼,則不執(zhí)行循環(huán)體帜消,for 循環(huán)結(jié)束。
執(zhí)行完循環(huán)體里的指令浓体,接著執(zhí)行括號(hào)里的第三句指令泡挺,用于更新變量的值。
再次對括號(hào)里的第二句指令做判斷命浴,如果條件為真粘衬,則執(zhí)行循環(huán)體(大括號(hào)里)的指令;如果為假,則不執(zhí)行循環(huán)體稚新,for 循環(huán)結(jié)束。
如此周而復(fù)始跪腹。注意褂删,括號(hào)里的第一句指令只會(huì)執(zhí)行一次,之后就用不上了冲茸。
簡單說來屯阀,for 循環(huán)濃縮了很多內(nèi)容在 for 后面的括號(hào)里。
一定要熟練掌握 for 循環(huán)轴术,因?yàn)闀?huì)很常用难衰。
6. 總結(jié)
循環(huán)能夠使我們的程序重復(fù)執(zhí)行一系列指令。
有好幾種循環(huán):while逗栽,do...while盖袭,for 。依場景不同彼宠,選擇某個(gè)循環(huán)會(huì)更適合鳄虱。
for 循環(huán)可能是使用最頻繁的循環(huán)語句了,在里面我們經(jīng)常會(huì)做變量的增減凭峡。
7. 第一部分第十課預(yù)告
今天的課就到這里拙已,一起加油吧!
下一課:C語言探索之旅 | 第一部分第十課:第一個(gè)C語言小游戲
下一課我們將編寫第一個(gè) C語言小游戲摧冀!
我是 謝恩銘倍踪,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)運(yùn)營者,慕課網(wǎng)精英講師 Oscar 老師索昂,終生學(xué)習(xí)者建车。
熱愛生活,喜歡游泳楼镐,略懂烹飪癞志。
人生格言:「向著標(biāo)桿直跑」