您好,登錄后才能下訂單哦!
在 C 語(yǔ)言中,我們會(huì)經(jīng)常遇到循環(huán)的情況,那么這時(shí)候我們就得用循環(huán)的語(yǔ)句了。常見(jiàn)的循環(huán)結(jié)構(gòu)有三種:do循環(huán)、while 循環(huán)以及 for 循環(huán)。循環(huán)語(yǔ)句的基本工作方式有:a> 通過(guò)條件表達(dá)式判定是否執(zhí)行循環(huán)體;b> 條件表達(dá)式遵循 if 語(yǔ)句表達(dá)式的原則。
我們先來(lái)看看這三種循環(huán)有何區(qū)別:a> do 語(yǔ)句是先執(zhí)行后判斷,循環(huán)體至少執(zhí)行一次; b> while 語(yǔ)句是先判斷后執(zhí)行,循環(huán)體可能不執(zhí)行; c> for 語(yǔ)句是先判斷后執(zhí)行,相比于 while 更簡(jiǎn)潔。
A、do ... while 語(yǔ)句的循環(huán)方式,結(jié)構(gòu)如下:
B、 while 語(yǔ)句的循環(huán)方式,結(jié)構(gòu)如下:
C、for 語(yǔ)句的循環(huán)方式,結(jié)構(gòu)如下:
我們下來(lái)就做個(gè)累加和的示例代碼,看看三種循環(huán)的區(qū)別,代碼如下:
#include <stdio.h> int f1(int n) { int ret = 0; if( n > 0 ) { do { ret += n; n--; } while( n > 0 ); } return ret; } int f2(int n) { int ret = 0; while( n > 0 ) { ret += n; n--; } return ret; } int f3(int n) { int ret = 0; int i = 0; for(i=1; i<=n; i++) { ret += i; } return ret; } int main() { printf("f1 : %d\n", f1(10)); printf("f2 : %d\n", f2(10)); printf("f3 : %d\n", f3(10)); return 0; }
編譯運(yùn)行后得到結(jié)果如圖所示:
我們看到程序正常運(yùn)行,結(jié)果輸出跟我們預(yù)想的一樣。那么通過(guò)對(duì)比我們也可以看出三種循環(huán)語(yǔ)句的用法區(qū)別,如果就實(shí)現(xiàn)累加和的這種情況來(lái)看,顯然 for 循環(huán)更加有優(yōu)勢(shì)。
下來(lái)我們來(lái)分析下 break 和 continue 的區(qū)別。break 表示終止循環(huán)的執(zhí)行,continue 表示終止本次循環(huán),進(jìn)入下次循環(huán)執(zhí)行。那么我們來(lái)思考下:switch 語(yǔ)句是否可以使用 continue 關(guān)鍵字?答案當(dāng)然是不能的,因?yàn)?switch 語(yǔ)句不是循環(huán)語(yǔ)句,它只是選擇分支語(yǔ)句。
下來(lái)我們來(lái)看個(gè)例子,看這個(gè)示例代碼會(huì)輸出什么?
#include <stdio.h> void f1(int n) { int i = 0; for(i=1; i<=n; i++) { if( (i % 2) == 0 ) { break; } printf("%d ", i); } printf("\n"); } void f2(int n) { int i = 0; for(i=1; i<=n; i++) { if( (i % 2) == 0 ) { continue; } printf("%d ", i); } printf("\n"); } int main() { f1(10); f2(10); return 0; }
我們先來(lái)分析下,f1(int n) 函數(shù)輸出一個(gè) 1 就終止循環(huán)了,因?yàn)槭?break 跳出循環(huán)體本身了。f2(int n) 函數(shù)會(huì)打印出 1 3 5 7 9,換句話說(shuō),這個(gè)函數(shù)實(shí)現(xiàn)的功能是輸出奇數(shù)。因?yàn)槿绻?2 能整除的話,就 跳過(guò)本次循環(huán)繼續(xù)下一次循環(huán)。 那么編譯運(yùn)行后結(jié)果如下,證實(shí)了我們的分析是對(duì)的。
那么 do ... while 循環(huán)還有這種 while(0) 的這種玩法,我們來(lái)看下面這個(gè)示例代碼:
#include <stdio.h> #include <malloc.h> int func(int n) { int i = 0; int ret = 0; int* p = (int*)malloc(sizeof(int) * n); do { if( NULL == p ) break; if( n < 5 ) break; if( n > 100) break; for(i=0; i<n; i++) { p[i] = i; printf("%d\n", p[i]); } ret = 1; }while( 0 ); printf("free(p)\n"); free(p); return ret; } int main() { if( func(7) ) { printf("OK\n"); } else { printf("ERROR\n"); } return 0; }
為什么要使用 while(0) 的這種用法呢?在本例中是為了避免由于不釋放 p 指針而造成的內(nèi)存泄漏。如果直接使用 return,那么會(huì)造成內(nèi)存泄漏。我們來(lái)看看運(yùn)行效果
那么如果 main 函數(shù)中輸入的是 2 呢?我們來(lái)看看效果
我們看到不管輸入的是幾,程序依然會(huì)執(zhí)行到 free(p) 那句,去釋放掉申請(qǐng)的內(nèi)存。這樣就不會(huì)造成內(nèi)存的泄漏問(wèn)題了。關(guān)于循環(huán)語(yǔ)句的總結(jié)就是:1、for 循環(huán)是先進(jìn)行判斷再進(jìn)入循環(huán)體,并且它適合于循環(huán)次數(shù)固定的場(chǎng)合;2、while 循環(huán)是先進(jìn)行判斷再進(jìn)入循環(huán)體執(zhí)行,它適合于循環(huán)次數(shù)不定的場(chǎng)合;3、do ... while 循環(huán)是先執(zhí)行循環(huán)體再進(jìn)行條件判斷,它至少執(zhí)行一次循環(huán)體。后面我們會(huì)繼續(xù)對(duì) C 語(yǔ)言的學(xué)習(xí)。
歡迎大家一起來(lái)學(xué)習(xí) C 語(yǔ)言,可以加我QQ:243343083。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。