C語言探索之旅 | 第一部分第九課:循環(huán)語句

作者 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)雕擂。
轉(zhuǎn)載請注明出處壮韭。
原文:http://www.reibang.com/p/9193259c0724

《C語言探索之旅》全系列

內(nèi)容簡介


  1. 前言
  2. 循環(huán)是什么
  3. while 循環(huán)
  4. do...while 循環(huán)
  5. for 循環(huán)
  6. 總結(jié)
  7. 第一部分第十課預(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)行的是:

  1. 電腦從上到下執(zhí)行各條指令,像往常一樣拳氢。
  2. 執(zhí)行完最后一條命令募逞,重新回到第一條命令,從上往下開始執(zhí)行馋评。
  3. 如此周而復(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 次“你好!”览效,如下:

你好!
你好!
你好!
你好!
你好!
你好!
你好!
你好!
你好!
你好!

邏輯到底是怎么樣的呢蒙具?

  1. counter 初始值為 0 。

  2. 我們的 while 循環(huán)的循環(huán)條件是 counter < 10朽肥,也就是說,只有在 counter 變量的值小于 10 的時(shí)候持钉,才會(huì)執(zhí)行循環(huán)體(大括號(hào)里)的指令:打印“你好!”衡招。

  3. 因?yàn)槌跏?counter 是 0,循環(huán)條件為真每强,所以執(zhí)行 printf始腾,顯示“你好!” 州刽。

  4. 在循環(huán)體中,我們將 counter 的值加 1 浪箭。

  5. 第二次判斷條件的時(shí)候穗椅,counter 的值已經(jīng)是 1 了,但還是滿足 counter < 10 這個(gè)條件奶栖,因此再次顯示“你好!”匹表。

  6. 如此這般,一直到 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)的邏輯是這樣的:

  1. 括號(hào)里的第一句指令用于初始化變量寞缝,只會(huì)執(zhí)行一次癌压,之后不再執(zhí)行。

  2. 對括號(hào)里的第二句指令做判斷荆陆,如果條件為真滩届,則執(zhí)行循環(huán)體(大括號(hào)里)的指令;如果為假被啼,則不執(zhí)行循環(huán)體帜消,for 循環(huán)結(jié)束。

  3. 執(zhí)行完循環(huán)體里的指令浓体,接著執(zhí)行括號(hào)里的第三句指令泡挺,用于更新變量的值。

  4. 再次對括號(hào)里的第二句指令做判斷命浴,如果條件為真粘衬,則執(zhí)行循環(huán)體(大括號(hào)里)的指令;如果為假,則不執(zhí)行循環(huán)體稚新,for 循環(huán)結(jié)束。

  5. 如此周而復(fù)始跪腹。注意褂删,括號(hào)里的第一句指令只會(huì)執(zhí)行一次,之后就用不上了冲茸。

簡單說來屯阀,for 循環(huán)濃縮了很多內(nèi)容在 for 后面的括號(hào)里。

一定要熟練掌握 for 循環(huán)轴术,因?yàn)闀?huì)很常用难衰。

6. 總結(jié)


  1. 循環(huán)能夠使我們的程序重復(fù)執(zhí)行一系列指令。

  2. 有好幾種循環(huán):while逗栽,do...while盖袭,for 。依場景不同彼宠,選擇某個(gè)循環(huán)會(huì)更適合鳄虱。

  3. 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)桿直跑」

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市框产,隨后出現(xiàn)的幾起案子凄杯,更是在濱河造成了極大的恐慌,老刑警劉巖秉宿,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戒突,死亡現(xiàn)場離奇詭異,居然都是意外死亡描睦,警方通過查閱死者的電腦和手機(jī)膊存,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隔崎,你說我怎么就攤上這事今艺。” “怎么了爵卒?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵虚缎,是天一觀的道長。 經(jīng)常有香客問我钓株,道長实牡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任轴合,我火速辦了婚禮创坞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘受葛。我一直安慰自己题涨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布奔坟。 她就那樣靜靜地躺著携栋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咳秉。 梳的紋絲不亂的頭發(fā)上婉支,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機(jī)與錄音澜建,去河邊找鬼向挖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛炕舵,可吹牛的內(nèi)容都是我干的何之。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼咽筋,長吁一口氣:“原來是場噩夢啊……” “哼溶推!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奸攻,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蒜危,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后睹耐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辐赞,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年硝训,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了响委。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片新思。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赘风,靈堂內(nèi)的尸體忽然破棺而出夹囚,到底是詐尸還是另有隱情,我是刑警寧澤邀窃,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布崔兴,位于F島的核電站,受9級特大地震影響蛔翅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜位谋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一山析、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掏父,春花似錦笋轨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至陶缺,卻和暖如春钾挟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饱岸。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工掺出, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苫费。 一個(gè)月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓汤锨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親百框。 傳聞我的和親對象是個(gè)殘疾皇子闲礼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

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

  • 作者 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)铐维。轉(zhuǎn)載請注明出處柬泽。原文:https://www.ji...
    程序員聯(lián)盟閱讀 2,132評論 9 20
  • 作者 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)方椎。轉(zhuǎn)載請注明出處聂抢。原文:https://www.ji...
    程序員聯(lián)盟閱讀 3,279評論 3 29
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)棠众,斷路器琳疏,智...
    卡卡羅2017閱讀 134,716評論 18 139
  • 生活中總有不愉快的事發(fā)生空盼,我也知道太在 意別人對自己的態(tài)度书幕,簡直是在自尋煩惱,但是偏偏無法釋懷揽趾。為什么自己就不能長...
    三褚粉閱讀 642評論 0 1
  • 突然收到寶貝們姑姑的信息台汇,發(fā)了很多圖片,頓時(shí)愣住了篱瞎,我的娃們苟呐,三日不見,當(dāng)刮目相看俐筋,全都成了土娃娃牵素,再看看那...
    李思睿vicky閱讀 290評論 0 1