C語言實(shí)例講解四大循環(huán)語句的使用
一、do…while()循環(huán)
1. 圖示流程

從上面圖示 do…while() 語句流程中可以看出,do…while() 語句會先進(jìn)入循環(huán)體執(zhí)行里面的內(nèi)容,然后再進(jìn)行條件判斷,當(dāng)條件為真,就繼續(xù)執(zhí)行循環(huán)體的內(nèi)容,當(dāng)條件為假就退出do…while() 語句。也就是說 do…while() 語句 最少會執(zhí)行一遍循環(huán)體里面的內(nèi)容。
2. 代碼流程
do {
語句塊
} while (表達(dá)式);
do…while() 語句的代碼流程也很簡單,程序執(zhí)行到 do…while() 語句的時(shí)候,會先執(zhí)行語句塊(也叫循環(huán)體)中的內(nèi)容,執(zhí)行完一次后,就會判斷表達(dá)式的內(nèi)容是真還是假,如果是真,那么就繼續(xù)執(zhí)行語句塊的內(nèi)容,如果是假,那么就不再執(zhí)行語句塊的內(nèi)容,而是退出該循環(huán)。在寫 do…while() 語句的時(shí)候 while 后面那個(gè)分號千萬不能掉了,這點(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)語句會先判斷條件,當(dāng)條件為真的時(shí)候才會執(zhí)行循環(huán)體,當(dāng)條件為假的時(shí)候直接就退出了循環(huán)體。也就是說,while() 語句循環(huán)體里面的內(nèi)容可能一次都不會被執(zhí)行,這就是 while() 語句和 do…while() 語句最大的區(qū)別。
2. 代碼流程
while (表達(dá)式) {
語句塊
}
while() 循環(huán)語句的代碼流程也很簡單,就是先判斷表達(dá)式的內(nèi)容,當(dāng)表達(dá)式為真的時(shí)候,就執(zhí)行語句塊的內(nèi)容,語句塊中的內(nèi)容執(zhí)行完了后又會判斷表達(dá)式的值,直到表達(dá)式的值為假才會跳出語句塊中。
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)的圖示代碼流程不能說毫不相干,只能說一模一樣。但是其代碼表現(xiàn)流程有點(diǎn)區(qū)別,下面來重點(diǎn)講解下for() 循環(huán)的代碼流程。
2. 代碼流程
for (表達(dá)式1; 表達(dá)式2; 表達(dá)式3)
{
語句塊
}
for() 循環(huán)的代碼流程看著表達(dá)式挺多的,好像挺復(fù)雜,但其實(shí)不然,讓我來為大家進(jìn)行細(xì)致講解。
for() 循環(huán)首先執(zhí)行表達(dá)式1,再執(zhí)行表達(dá)式2,當(dāng)表達(dá)式2的值為真的時(shí)候就會執(zhí)行語句塊的內(nèi)容,語句塊內(nèi)容執(zhí)行完后就會執(zhí)行表達(dá)式3,表達(dá)式3執(zhí)行完,又會跳轉(zhuǎn)執(zhí)行表達(dá)式2,當(dāng)表達(dá)式2為真,又執(zhí)行語句塊,相當(dāng)于循環(huán)一直在 表達(dá)式2 -> 語句塊 -> 表達(dá)式3 之間循環(huán)。當(dāng)表達(dá)式2的值為假的時(shí)候就會跳出循環(huán)。
for() 循環(huán)有幾個(gè)地方值得大家注意:
(1)表達(dá)式1只會在剛進(jìn) for 循環(huán)的時(shí)候執(zhí)行一次。
(2)在c99及之后的標(biāo)準(zhǔn)中,表達(dá)式1處可以定義變量,變量周期在整個(gè)for循環(huán)中。但是c98不允許這樣做,否則編譯器會報(bào)錯(cuò)。
(3)表達(dá)式1、表達(dá)式2、表達(dá)式3 都可以不寫省略。但是當(dāng)表達(dá)式2省略不寫的時(shí)候意味著,編譯器在處理這里的時(shí)候這里不為假,從而會執(zhí)行語句塊。
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)簽;
讀到這里可能有讀者會發(fā)現(xiàn),為啥前面都有圖解,goto 語句沒有,是作者不會了嗎?哈哈,其實(shí)回答這個(gè)問題我只能說是也不是?;卮鹗?,是因?yàn)榇_實(shí)沒圖解,因?yàn)?goto 語句太簡單了,簡單到把我給整不會了。回答不是,是因?yàn)楹唵蔚經(jīng)]必要,哈哈~~
其實(shí)通過代碼流程就可以看出,goto 語句確實(shí)很簡單,就是當(dāng)程序運(yùn)行到 goto 那里的時(shí)候會跳轉(zhuǎn)到標(biāo)簽處接著運(yùn)行,這種跳轉(zhuǎn)是無條件跳轉(zhuǎn),只要程序運(yùn)行到 goto,就會跳轉(zhuǎn)!?。?biāo)簽處可以任意命名,命名規(guī)則必須遵循C語言標(biāo)識符命名法。標(biāo)簽可以寫在 goto 的前面,也可以寫在 goto 的后面,這點(diǎn)不受影響。程序運(yùn)行到標(biāo)簽處不會做任何處理,只有g(shù)oto 才會跳轉(zhuǎn)到標(biāo)簽?zāi)抢?,上面兩個(gè)標(biāo)簽的地方名字需要一模一樣。
其實(shí)說到goto語句,就不得不提一下goto的歷史了,其實(shí)在編程的時(shí)候大家有個(gè)約定俗成的規(guī)矩,那就是能不用goto的地方那就不用,為什么會這樣呢,其實(shí)就是我上面提到的,goto 語句會無條件跳轉(zhuǎn),這點(diǎn)就和其他三個(gè)循環(huán)不同。了解C語言的人都知道,C語言是面向過程編程,怎么理解面向過程編程呢,其實(shí)就是和人一樣,就是現(xiàn)做什么再做什么,人早上起來要先刷牙,再吃早餐。C語言也一樣,要使用變量,就得先定義變量。面向過程就類似這個(gè)道理。但是 goto 會無條件跳轉(zhuǎn),這就會讓讀代碼的人感覺很混亂,要在代碼中亂跳,并且使用不恰當(dāng)?shù)脑捦_(dá)不到自己想要的效果,這也因此使得大家能不用 goto 就盡量不使用 goto。但是在linux內(nèi)核代碼中,goto 卻會被常常用作一個(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
寫這個(gè)代碼是想告訴大家,都是實(shí)現(xiàn) 1 到 100 求和,但是4種循環(huán)語句都可以做到,也就是說4種循環(huán)之間都可以相互轉(zhuǎn)換,具體想用哪種循環(huán)就全看大家自己的選擇了,但是為了遵循約定俗成的東西,除了特殊場景,大家還是盡量不要使用 goto 語句了。
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
大家看看上面這段代碼,首先申請了10字節(jié)空間,如果申請失敗,那么我下面的代碼就沒有執(zhí)行的必要了,所以直接退出程序。申請成功就會繼續(xù)申請20字節(jié)空間,假如在這時(shí)什么失敗了,那么下面的代碼也同樣沒有執(zhí)行的必要,然后我也要退出程序,但是在退出程序前,需要將 p1 指向的那塊內(nèi)存給釋放掉,否則就會造成內(nèi)存泄漏。如果繼續(xù)申請成功,就會再申請30字節(jié)空間,如果申請失敗,那么也要退出程序,并且在退出前需要釋放前兩次申請的空間。上面使用 goto 語句有兩大優(yōu)勢,其一就是可讀性高,操作方便,不然就要在后面每次申請失敗的里面加上釋放前面申請的內(nèi)存的操作,很明顯如果這樣做,代碼移植效率就會很低,而且假如在中間加了一次申請內(nèi)存的操作,后面的地方就都要加上出錯(cuò)釋放內(nèi)存的步驟。其二就是保持程序退出的地方統(tǒng)一,如果不這樣做,需要在每個(gè)出錯(cuò)的地方加上 return 的操作,代碼可讀性沒有這樣做高。在linux內(nèi)核代碼種,像上面這樣使用 goto 語句的操作是經(jīng)常被用到的,很顯然上面這種做法很巧妙,其實(shí)在linux內(nèi)核代碼中還有很多巧妙的操作,如果可以的話,大家可以多讀讀linux源碼,對自己的編碼功底將會有很大的提升的。
到此這篇關(guān)于C語言實(shí)例講解四大循環(huán)語句的使用的文章就介紹到這了,更多相關(guān)C語言循環(huán)語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)判斷一個(gè)字符串是否為UTF8或GBK格式的方法
這篇文章主要介紹了C++實(shí)現(xiàn)判斷一個(gè)字符串是否為UTF8或GBK格式的方法,涉及C++針對字符編碼的遍歷、判斷、編碼轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
C++中發(fā)送HTTP請求的實(shí)現(xiàn)方式
使用C++編程發(fā)送HTTP請求通常需要使用第三方的HTTP庫或框架,在C++中,有幾個(gè)受歡迎的HTTP庫可供選擇,例如Curl、Boost.Beast和cpp-httplib,另外,也可以自己實(shí)現(xiàn)socket來發(fā)送http請求,需要的朋友可以參考下2024-04-04
淺談C++基類的析構(gòu)函數(shù)為虛函數(shù)
本文重點(diǎn):應(yīng)該為多態(tài)基類聲明虛析構(gòu)器。一旦一個(gè)類包含虛函數(shù),它就應(yīng)該包含一個(gè)虛析構(gòu)器。如果一個(gè)類不用作基類或者不需具有多態(tài)性,便不應(yīng)該為它聲明虛析構(gòu)器。2015-10-10
C語言函數(shù)聲明以及函數(shù)原型超詳細(xì)講解示例
這篇文章主要介紹了C語言函數(shù)聲明以及函數(shù)原型超詳細(xì)講解,C語言代碼由上到下依次執(zhí)行,原則上函數(shù)定義要出現(xiàn)在函數(shù)調(diào)用之前,否則就會報(bào)錯(cuò)。但在實(shí)際開發(fā)中,經(jīng)常會在函數(shù)定義之前使用它們,這個(gè)時(shí)候就需要提前聲明2023-02-02
C++ operator關(guān)鍵字(重載操作符)的用法詳解
下面小編就為大家?guī)硪黄狢++ operator關(guān)鍵字(重載操作符)的用法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01

