C語(yǔ)言實(shí)例講解四大循環(huán)語(yǔ)句的使用
一、do…while()循環(huán)
1. 圖示流程
從上面圖示 do…while() 語(yǔ)句流程中可以看出,do…while() 語(yǔ)句會(huì)先進(jìn)入循環(huán)體執(zhí)行里面的內(nèi)容,然后再進(jìn)行條件判斷,當(dāng)條件為真,就繼續(xù)執(zhí)行循環(huán)體的內(nèi)容,當(dāng)條件為假就退出do…while() 語(yǔ)句。也就是說(shuō) do…while() 語(yǔ)句 最少會(huì)執(zhí)行一遍循環(huán)體里面的內(nèi)容。
2. 代碼流程
do {
語(yǔ)句塊
} while (表達(dá)式);
do…while() 語(yǔ)句的代碼流程也很簡(jiǎn)單,程序執(zhí)行到 do…while() 語(yǔ)句的時(shí)候,會(huì)先執(zhí)行語(yǔ)句塊(也叫循環(huán)體)中的內(nèi)容,執(zhí)行完一次后,就會(huì)判斷表達(dá)式的內(nèi)容是真還是假,如果是真,那么就繼續(xù)執(zhí)行語(yǔ)句塊的內(nèi)容,如果是假,那么就不再執(zhí)行語(yǔ)句塊的內(nèi)容,而是退出該循環(huán)。在寫(xiě) do…while() 語(yǔ)句的時(shí)候 while 后面那個(gè)分號(hào)千萬(wàn)不能掉了,這點(diǎn)新手尤其要注意
3. 示例代碼1到100求和)
源代碼:
#include <stdio.h> int main() { int i = 0, sum = 0; do { sum += i; i++; } while (i <= 100); printf("sum = %d\n", sum); return 0; }
運(yùn)行結(jié)果:
sum = 5050
二、while()循環(huán)
1. 圖示流程
while() 循環(huán)語(yǔ)句會(huì)先判斷條件,當(dāng)條件為真的時(shí)候才會(huì)執(zhí)行循環(huán)體,當(dāng)條件為假的時(shí)候直接就退出了循環(huán)體。也就是說(shuō),while() 語(yǔ)句循環(huán)體里面的內(nèi)容可能一次都不會(huì)被執(zhí)行,這就是 while() 語(yǔ)句和 do…while() 語(yǔ)句最大的區(qū)別。
2. 代碼流程
while (表達(dá)式) {
語(yǔ)句塊
}
while() 循環(huán)語(yǔ)句的代碼流程也很簡(jiǎn)單,就是先判斷表達(dá)式的內(nèi)容,當(dāng)表達(dá)式為真的時(shí)候,就執(zhí)行語(yǔ)句塊的內(nèi)容,語(yǔ)句塊中的內(nèi)容執(zhí)行完了后又會(huì)判斷表達(dá)式的值,直到表達(dá)式的值為假才會(huì)跳出語(yǔ)句塊中。
3. 示例代碼(1到100求和)
源代碼:
#include <stdio.h> int main() { int i = 0, sum = 0; while (i <= 100) { sum += i; i++; } printf("sum = %d\n", sum); return 0; }
運(yùn)行結(jié)果:
sum = 5050
三、for()循環(huán)
1. 圖示流程
for() 循環(huán)的圖示代碼流程和 while() 循環(huán)的圖示代碼流程不能說(shuō)毫不相干,只能說(shuō)一模一樣。但是其代碼表現(xiàn)流程有點(diǎn)區(qū)別,下面來(lái)重點(diǎn)講解下for() 循環(huán)的代碼流程。
2. 代碼流程
for (表達(dá)式1; 表達(dá)式2; 表達(dá)式3)
{
語(yǔ)句塊
}
for() 循環(huán)的代碼流程看著表達(dá)式挺多的,好像挺復(fù)雜,但其實(shí)不然,讓我來(lái)為大家進(jìn)行細(xì)致講解。
for() 循環(huán)首先執(zhí)行表達(dá)式1,再執(zhí)行表達(dá)式2,當(dāng)表達(dá)式2的值為真的時(shí)候就會(huì)執(zhí)行語(yǔ)句塊的內(nèi)容,語(yǔ)句塊內(nèi)容執(zhí)行完后就會(huì)執(zhí)行表達(dá)式3,表達(dá)式3執(zhí)行完,又會(huì)跳轉(zhuǎn)執(zhí)行表達(dá)式2,當(dāng)表達(dá)式2為真,又執(zhí)行語(yǔ)句塊,相當(dāng)于循環(huán)一直在 表達(dá)式2 -> 語(yǔ)句塊 -> 表達(dá)式3 之間循環(huán)。當(dāng)表達(dá)式2的值為假的時(shí)候就會(huì)跳出循環(huán)。
for() 循環(huán)有幾個(gè)地方值得大家注意:
(1)表達(dá)式1只會(huì)在剛進(jìn) for 循環(huán)的時(shí)候執(zhí)行一次。
(2)在c99及之后的標(biāo)準(zhǔn)中,表達(dá)式1處可以定義變量,變量周期在整個(gè)for循環(huán)中。但是c98不允許這樣做,否則編譯器會(huì)報(bào)錯(cuò)。
(3)表達(dá)式1、表達(dá)式2、表達(dá)式3 都可以不寫(xiě)省略。但是當(dāng)表達(dá)式2省略不寫(xiě)的時(shí)候意味著,編譯器在處理這里的時(shí)候這里不為假,從而會(huì)執(zhí)行語(yǔ)句塊。
3. 示例代碼(1到100求和)
源代碼:
#include <stdio.h> int main() { int i = 0, sum = 0; for (i = 0; i <= 100; i++) { sum += i; } printf("sum = %d\n", sum); return 0; }
運(yùn)行結(jié)果:
sum = 5050
四、goto循環(huán)
1. 代碼流程
標(biāo)簽:
goto 標(biāo)簽;
讀到這里可能有讀者會(huì)發(fā)現(xiàn),為啥前面都有圖解,goto 語(yǔ)句沒(méi)有,是作者不會(huì)了嗎?哈哈,其實(shí)回答這個(gè)問(wèn)題我只能說(shuō)是也不是。回答是,是因?yàn)榇_實(shí)沒(méi)圖解,因?yàn)?goto 語(yǔ)句太簡(jiǎn)單了,簡(jiǎn)單到把我給整不會(huì)了?;卮鸩皇牵且?yàn)楹?jiǎn)單到?jīng)]必要,哈哈~~
其實(shí)通過(guò)代碼流程就可以看出,goto 語(yǔ)句確實(shí)很簡(jiǎn)單,就是當(dāng)程序運(yùn)行到 goto 那里的時(shí)候會(huì)跳轉(zhuǎn)到標(biāo)簽處接著運(yùn)行,這種跳轉(zhuǎn)是無(wú)條件跳轉(zhuǎn),只要程序運(yùn)行到 goto,就會(huì)跳轉(zhuǎn)?。。?biāo)簽處可以任意命名,命名規(guī)則必須遵循C語(yǔ)言標(biāo)識(shí)符命名法。標(biāo)簽可以寫(xiě)在 goto 的前面,也可以寫(xiě)在 goto 的后面,這點(diǎn)不受影響。程序運(yùn)行到標(biāo)簽處不會(huì)做任何處理,只有g(shù)oto 才會(huì)跳轉(zhuǎn)到標(biāo)簽?zāi)抢铮厦鎯蓚€(gè)標(biāo)簽的地方名字需要一模一樣。
其實(shí)說(shuō)到goto語(yǔ)句,就不得不提一下goto的歷史了,其實(shí)在編程的時(shí)候大家有個(gè)約定俗成的規(guī)矩,那就是能不用goto的地方那就不用,為什么會(huì)這樣呢,其實(shí)就是我上面提到的,goto 語(yǔ)句會(huì)無(wú)條件跳轉(zhuǎn),這點(diǎn)就和其他三個(gè)循環(huán)不同。了解C語(yǔ)言的人都知道,C語(yǔ)言是面向過(guò)程編程,怎么理解面向過(guò)程編程呢,其實(shí)就是和人一樣,就是現(xiàn)做什么再做什么,人早上起來(lái)要先刷牙,再吃早餐。C語(yǔ)言也一樣,要使用變量,就得先定義變量。面向過(guò)程就類(lèi)似這個(gè)道理。但是 goto 會(huì)無(wú)條件跳轉(zhuǎn),這就會(huì)讓讀代碼的人感覺(jué)很混亂,要在代碼中亂跳,并且使用不恰當(dāng)?shù)脑捦_(dá)不到自己想要的效果,這也因此使得大家能不用 goto 就盡量不使用 goto。但是在linux內(nèi)核代碼中,goto 卻會(huì)被常常用作一個(gè)判錯(cuò)用途。先看下面示例代碼-2,結(jié)合代碼和大家一起講解。
2. 示例代碼-1(1到100求和)
源代碼:
#include <stdio.h> int main() { int i = 0, sum = 0; loop: if (i <= 100) { sum += i; i++; goto loop; } printf("sum = %d\n", sum); return 0; }
運(yùn)行結(jié)果:
sum = 5050
寫(xiě)這個(gè)代碼是想告訴大家,都是實(shí)現(xiàn) 1 到 100 求和,但是4種循環(huán)語(yǔ)句都可以做到,也就是說(shuō)4種循環(huán)之間都可以相互轉(zhuǎn)換,具體想用哪種循環(huán)就全看大家自己的選擇了,但是為了遵循約定俗成的東西,除了特殊場(chǎng)景,大家還是盡量不要使用 goto 語(yǔ)句了。
3. 示例代碼-2
源代碼:
#include <stdio.h> #include <stdlib.h> int main() { int *p1, *p2, *p3; p1 = malloc(10); if (p1 == NULL) { printf("malloc failed : 1\n"); goto loop_1; } *p1 = 1; p2 = malloc(20); if (p2 == NULL) { printf("malloc failed : 2\n"); goto loop_2; } *p2 = 2; p3 = malloc(30); if (p3 == NULL) { printf("malloc failed : 3\n"); goto loop_3; } *p3 = 3; printf("*p1 = %d, *p2 = %d, *p3 = %d\n", *p1, *p2, *p3); loop_3: free(p2); loop_2: free(p1); loop_1: return 0; }
運(yùn)行結(jié)果:
*p1 = 1, *p2 = 2, *p3 = 3
大家看看上面這段代碼,首先申請(qǐng)了10字節(jié)空間,如果申請(qǐng)失敗,那么我下面的代碼就沒(méi)有執(zhí)行的必要了,所以直接退出程序。申請(qǐng)成功就會(huì)繼續(xù)申請(qǐng)20字節(jié)空間,假如在這時(shí)什么失敗了,那么下面的代碼也同樣沒(méi)有執(zhí)行的必要,然后我也要退出程序,但是在退出程序前,需要將 p1 指向的那塊內(nèi)存給釋放掉,否則就會(huì)造成內(nèi)存泄漏。如果繼續(xù)申請(qǐng)成功,就會(huì)再申請(qǐng)30字節(jié)空間,如果申請(qǐng)失敗,那么也要退出程序,并且在退出前需要釋放前兩次申請(qǐng)的空間。上面使用 goto 語(yǔ)句有兩大優(yōu)勢(shì),其一就是可讀性高,操作方便,不然就要在后面每次申請(qǐng)失敗的里面加上釋放前面申請(qǐng)的內(nèi)存的操作,很明顯如果這樣做,代碼移植效率就會(huì)很低,而且假如在中間加了一次申請(qǐng)內(nèi)存的操作,后面的地方就都要加上出錯(cuò)釋放內(nèi)存的步驟。其二就是保持程序退出的地方統(tǒng)一,如果不這樣做,需要在每個(gè)出錯(cuò)的地方加上 return 的操作,代碼可讀性沒(méi)有這樣做高。在linux內(nèi)核代碼種,像上面這樣使用 goto 語(yǔ)句的操作是經(jīng)常被用到的,很顯然上面這種做法很巧妙,其實(shí)在linux內(nèi)核代碼中還有很多巧妙的操作,如果可以的話,大家可以多讀讀linux源碼,對(duì)自己的編碼功底將會(huì)有很大的提升的。
到此這篇關(guān)于C語(yǔ)言實(shí)例講解四大循環(huán)語(yǔ)句的使用的文章就介紹到這了,更多相關(guān)C語(yǔ)言循環(huán)語(yǔ)句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ leetcode之刪除并獲得點(diǎn)數(shù)的示例代碼
這篇文章主要介紹了C++ leetcode之刪除并獲得點(diǎn)數(shù)的示例代碼,本文給大家分享問(wèn)題解析及解決方案,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05深入講解C++數(shù)據(jù)類(lèi)型轉(zhuǎn)換的相關(guān)函數(shù)的知識(shí)
這篇文章主要介紹了深入講解C++數(shù)據(jù)類(lèi)型轉(zhuǎn)換的相關(guān)函數(shù)的知識(shí),包括類(lèi)型轉(zhuǎn)換運(yùn)算符函數(shù)等內(nèi)容,需要的朋友可以參考下2015-09-09C語(yǔ)言怎么連接兩個(gè)數(shù)組的內(nèi)容你知道嗎
這篇文章主要為大家介紹了C語(yǔ)言怎么連接兩個(gè)數(shù)組的內(nèi)容,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01C++實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)的順序表詳解
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動(dòng)態(tài)順序表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11opencv3/C++圖像濾波實(shí)現(xiàn)方式
今天小編就為大家分享一篇opencv3/C++圖像濾波實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12