App下載

從零開(kāi)始學(xué)習(xí)C語(yǔ)言丨循環(huán)結(jié)構(gòu)

三玹 2022-11-04 15:39:20 瀏覽數(shù) (2200)
反饋
原文: https://mp.weixin.qq.com/s?__biz=Mzg3OTc3MjcyOQ==&mid=2247483800&idx=1&sn=189523820d4631aae7c3bbc090ff2a71&chksm=cf7e14cef8099dd8cb363d77af5960feb809cc60a0d8b5af4940e11400fef1ebf621d64a7344&scene=178&cur_album_id=2588823761982849025#rd

本文發(fā)布于微信公眾號(hào):三玹
首先,我們先來(lái)認(rèn)識(shí)一下什么是循環(huán)?循環(huán)是在滿足某個(gè)條件的情況下,讓計(jì)算機(jī)幫忙重復(fù)執(zhí)行某個(gè)命令或者某一塊命令。
C語(yǔ)言中的循環(huán)結(jié)構(gòu)包括了:for循環(huán)、while循環(huán)、do...while循環(huán)以及嵌套循環(huán)。
for循環(huán)
先來(lái)看一下 for 循環(huán)的語(yǔ)法結(jié)構(gòu):
for(init;condition;increment){
  statements;
}
for循環(huán)要具備的四個(gè)部分:
1、init:初始值。一般是變量賦值,只在第一次循環(huán)的時(shí)候才會(huì)被使用到,之后的每一次循環(huán)就用不到這個(gè)初始值。其作用是為了賦給后面的 condition 中進(jìn)行判斷。
2、condition:判斷式。循環(huán)結(jié)構(gòu)中的判斷條件,第一次循環(huán)開(kāi)始前接收 init 傳過(guò)來(lái)的值,往后是接收 increment 傳過(guò)來(lái)的值。判斷是否成立,成立則開(kāi)始循環(huán),不成立就結(jié)束循環(huán)。
3、statements:執(zhí)行語(yǔ)句。當(dāng) condition 里面的條件滿足時(shí),則會(huì)開(kāi)始執(zhí)行循環(huán)代碼塊里面的指令。
4、increment:增量表達(dá)式。每一次循環(huán)執(zhí)行完語(yǔ)句后,都會(huì)調(diào)用 increment 中的命令,更新 init 定義的變量的值。然后傳給 condition,繼續(xù)循環(huán)。
接下來(lái),我們來(lái)用 for 循環(huán)來(lái)打印 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)之外定義的。
不過(guò)這兩者是有區(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í)行語(yǔ)句,每循環(huán)一次都會(huì)執(zhí)行一次打印命令,把此時(shí) i 的值打印在控制臺(tái)。
第四個(gè)增量表達(dá)式,每循環(huán)一次,i 變量就自增一次,然后傳給判斷式進(jìn)行判斷。以此往復(fù) 2-4 的內(nèi)容。
那么有朋友要問(wèn),除了自增,我想自減行嗎?
當(dāng)然也是可以的。同樣是打印0-100之間的數(shù)字,但是要求是從100開(kāi)始。這時(shí)候初始值要初始化 i 變量的值是 100,判斷式是小等于 0,增量表達(dá)式就可以使用自減 i--。
while循環(huán)
同樣,while循環(huán)也是需要初始值,判斷式,執(zhí)行語(yǔ)句以及增量表達(dá)式。
語(yǔ)法結(jié)構(gòu):
int i = 0;
while(i <= 5){
  printf("%d", i);
  i++;
}

和 for 循環(huán)不同的是,while 的初始值得在循環(huán)體外面進(jìn)行初始化,然后將初始化后的變量傳遞給 while 關(guān)鍵字后面括號(hào)里的條件判斷式。

do...while循環(huán)
和while循環(huán)很相似,但又有不同。同時(shí),do...while是一種比較特殊的循環(huán)結(jié)構(gòu),即便判斷的條件不滿足,都至少會(huì)執(zhí)行一次循環(huán)體的內(nèi)容
來(lái)看一個(gè)簡(jiǎn)單的例子:
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ī)語(yǔ)言是按順序執(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)
循環(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è)就差不多了。
關(guān)鍵字
C語(yǔ)言中有三個(gè)被應(yīng)用在循環(huán)中的關(guān)鍵字,分別是:
break:用來(lái)終結(jié)循環(huán)的。
continue:用來(lái)跳過(guò)循環(huán)中符合某個(gè)條件的內(nèi)容。
goto:用來(lái)把控制無(wú)條件轉(zhuǎn)移到同一函數(shù)內(nèi)被標(biāo)記的語(yǔ)言。但這個(gè)關(guān)鍵字通常都不被建議使用,就不在這里展開(kāi)了。
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;
  }
}
運(yùn)行結(jié)果:
你拿了1個(gè)蘋果。
你拿了2個(gè)蘋果。
你拿了3個(gè)蘋果。
你已經(jīng)拿到3個(gè)蘋果了,停手吧!
再來(lái)看一下 continue 的使用。例如:10 以內(nèi)的數(shù)字,除了 3 的倍數(shù)的數(shù)字,其他都要打印出來(lái)。
int i=0;
while(i<10){
  if(i % 3 == 0){
    continue;
  }
  printf("%d", i);
}
運(yùn)行結(jié)果:0124578
死循環(huán)
前面都是在滿足條件的情況下發(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é)合在一起的,用來(lái)強(qiáng)行終止循環(huán)。
下面來(lái)看一下 for循環(huán)、while循環(huán)、do...while循環(huán)的死循環(huán)狀態(tài)。
// for循環(huán)
for(int i=0; i < 1; ){
  printf("循環(huán)中...");
}
// while循環(huán)
while(1){
  printf("循環(huán)中...");
}
// do...while循環(huán)
do{
  printf("循環(huán)中...");
}while(1);
想要讓循環(huán)成為了一個(gè)死循環(huán)其實(shí)很簡(jiǎn)單,只要保證循環(huán)中判斷條件式的結(jié)果一直是為真,也就是符合條件的情況。
總結(jié)
關(guān)于循環(huán)結(jié)構(gòu)的知識(shí)就講到這里結(jié)束了,文中有什么不足之處,希望大家可以在評(píng)論區(qū)留下寶貴建議。下一篇,準(zhǔn)備用學(xué)習(xí)的判斷和循環(huán)結(jié)構(gòu)來(lái)實(shí)現(xiàn)簡(jiǎn)單的算法——二分法以及冒泡排序。


C

0 人點(diǎn)贊