本文發(fā)布于微信公眾號(hào):三玹
首先,我們先來認(rèn)識(shí)一下什么是循環(huán)?循環(huán)是在滿足某個(gè)條件的情況下,讓計(jì)算機(jī)幫忙重復(fù)執(zhí)行某個(gè)命令或者某一塊命令。C語言中的循環(huán)結(jié)構(gòu)包括了:for循環(huán)、while循環(huán)、do...while循環(huán)以及嵌套循環(huán)。
先來看一下 for 循環(huán)的語法結(jié)構(gòu):for(init;condition;increment){
statements;
}
1、init:初始值。一般是變量賦值,只在第一次循環(huán)的時(shí)候才會(huì)被使用到,之后的每一次循環(huán)就用不到這個(gè)初始值。其作用是為了賦給后面的 condition 中進(jìn)行判斷。
2、condition:判斷式。循環(huán)結(jié)構(gòu)中的判斷條件,第一次循環(huán)開始前接收 init 傳過來的值,往后是接收 increment 傳過來的值。判斷是否成立,成立則開始循環(huán),不成立就結(jié)束循環(huán)。3、statements:執(zhí)行語句。當(dāng) condition 里面的條件滿足時(shí),則會(huì)開始執(zhí)行循環(huán)代碼塊里面的指令。4、increment:增量表達(dá)式。每一次循環(huán)執(zhí)行完語句后,都會(huì)調(diào)用 increment 中的命令,更新 init 定義的變量的值。然后傳給 condition,繼續(xù)循環(huán)。接下來,我們來用 for 循環(huán)來打印 0-100 的內(nèi)容:for(int i=0;i<=100;i++){
printf("%d", i);
}
第一個(gè)初始值,初始化了一個(gè) int 類型的變量 i,并給它一個(gè)初始值 0。當(dāng)然聲明變量的行為,也可以在 for 循環(huán)之外定義的。
不過這兩者是有區(qū)別的。for循環(huán)里面定義的稱為臨時(shí)變量,當(dāng)for循環(huán)結(jié)束后,這個(gè)變量就從內(nèi)存中刪掉了,在循環(huán)結(jié)構(gòu)之外使用變量 i 是會(huì)報(bào)錯(cuò)的;for循環(huán)外面定義的稱為全局變量,即使循環(huán)結(jié)束,變量 i 還是存在,且此時(shí)的值是 101。
一般建議是在for循環(huán)中進(jìn)行變量的初始化。
第二個(gè)判斷式,判斷 i 是否小等于100,是的話就執(zhí)行下面的打印命令,不是的話就結(jié)束循環(huán)不再運(yùn)行。
第三個(gè)執(zhí)行語句,每循環(huán)一次都會(huì)執(zhí)行一次打印命令,把此時(shí) i 的值打印在控制臺(tái)。第四個(gè)增量表達(dá)式,每循環(huán)一次,i 變量就自增一次,然后傳給判斷式進(jìn)行判斷。以此往復(fù) 2-4 的內(nèi)容。當(dāng)然也是可以的。同樣是打印0-100之間的數(shù)字,但是要求是從100開始。這時(shí)候初始值要初始化 i 變量的值是 100,判斷式是小等于 0,增量表達(dá)式就可以使用自減 i--。
同樣,while循環(huán)也是需要初始值,判斷式,執(zhí)行語句以及增量表達(dá)式。int i = 0;
while(i <= 5){
printf("%d", i);
i++;
}
和 for 循環(huán)不同的是,while 的初始值得在循環(huán)體外面進(jìn)行初始化,然后將初始化后的變量傳遞給 while 關(guān)鍵字后面括號(hào)里的條件判斷式。
和while循環(huán)很相似,但又有不同。同時(shí),do...while是一種比較特殊的循環(huán)結(jié)構(gòu),即便判斷的條件不滿足,都至少會(huì)執(zhí)行一次循環(huán)體的內(nèi)容。
int i = 0;
do{
i++;
printf("%d\n", i);
}while(i<0);
printf("%d", i);
如果按照 while 循環(huán),首先會(huì)將初始化的 i 變量代入while后面的判斷式。顯然結(jié)果是不滿足的,因此是不會(huì)執(zhí)行代碼塊里面的內(nèi)容。所以在while循環(huán)里面,這個(gè)案例只輸出了一個(gè) 0。但在do...while里,這段代碼的結(jié)果輸出是:1 1。
按照我的理解,計(jì)算機(jī)語言是按順序執(zhí)行的,那么do...while循環(huán)首先被執(zhí)行的是 do 后面的代碼塊。因此,執(zhí)行了一次累加和打印命令。緊接著運(yùn)行到while的判斷式,結(jié)果不滿足條件,該循環(huán)就結(jié)束了。最后再執(zhí)行代碼塊外面的打印命令,而此時(shí)變量 i 的值已經(jīng)發(fā)生了改變,結(jié)果就是 1 1。
循環(huán)結(jié)構(gòu)同判斷結(jié)構(gòu)一樣,也是可以進(jìn)行嵌套(套娃行為)的。
例如:循環(huán)打印1-10中的所有值,在打印每一個(gè)值的時(shí)候,同時(shí)跟著要打印 3 個(gè) 1。(用for循環(huán)寫)for(int i=1;i<=10;i++){
printf("%d",i);
for(int j=1;i<=3;i++){
printf("1");
}
}
嵌套的行為在代碼中建議是盡可能少用,一是影響代碼的閱讀性,二是會(huì)導(dǎo)致后期代碼維護(hù)變得困難。
所以,嵌套這個(gè)行為盡可能少用;當(dāng)不得不用的使用,也要盡可能少嵌套的層數(shù),一般三個(gè)就差不多了。C語言中有三個(gè)被應(yīng)用在循環(huán)中的關(guān)鍵字,分別是:break:用來終結(jié)循環(huán)的。
continue:用來跳過循環(huán)中符合某個(gè)條件的內(nèi)容。
goto:用來把控制無條件轉(zhuǎn)移到同一函數(shù)內(nèi)被標(biāo)記的語言。但這個(gè)關(guān)鍵字通常都不被建議使用,就不在這里展開了。break 和 continue 在循環(huán)中通常需要和判斷結(jié)構(gòu)結(jié)合在一起使用。首先看一下 break 的使用。例如:我有一百個(gè)蘋果,但我只需要從中拿出三個(gè)就夠了。for(int i=1;i<=100;i++){
printf("你拿了%d個(gè)蘋果。\n", i);
if(i == 3){
printf("你已經(jīng)拿到3個(gè)蘋果了,停手吧!");
break;
}
}
你已經(jīng)拿到3個(gè)蘋果了,停手吧!再來看一下 continue 的使用。例如:10 以內(nèi)的數(shù)字,除了 3 的倍數(shù)的數(shù)字,其他都要打印出來。int i=0;
while(i<10){
if(i % 3 == 0){
continue;
}
printf("%d", i);
}
前面都是在滿足條件的情況下發(fā)生,那么如果一直都不滿足判斷式的條件,那么結(jié)果會(huì)是怎么樣呢?
答案很明顯,就是會(huì)一直循環(huán)下去,永不停息。這種情況就會(huì)導(dǎo)致程序一直在運(yùn)行當(dāng)中,不會(huì)正常結(jié)束。這種情況就類似于先帝創(chuàng)業(yè)未半,而中道崩殂。也就被稱之為死循環(huán)。在程序中,一旦出現(xiàn)循環(huán)的判斷條件一直處于滿足的情況下,就要注意了。
死循環(huán),一般都是要和 break 關(guān)鍵字結(jié)合在一起的,用來強(qiáng)行終止循環(huán)。
下面來看一下 for循環(huán)、while循環(huán)、do...while循環(huán)的死循環(huán)狀態(tài)。
for(int i=0; i < 1; ){
printf("循環(huán)中...");
}
while(1){
printf("循環(huán)中...");
}
do{
printf("循環(huán)中...");
}while(1);
想要讓循環(huán)成為了一個(gè)死循環(huán)其實(shí)很簡單,只要保證循環(huán)中判斷條件式的結(jié)果一直是為真,也就是符合條件的情況。
關(guān)于循環(huán)結(jié)構(gòu)的知識(shí)就講到這里結(jié)束了,文中有什么不足之處,希望大家可以在評(píng)論區(qū)留下寶貴建議。下一篇,準(zhǔn)備用學(xué)習(xí)的判斷和循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)簡單的算法——二分法以及冒泡排序。