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