語句(下))
上一片博客講解了我對選擇結(jié)構(gòu)相關(guān)基本知識的理解這篇將講解循環(huán)結(jié)構(gòu)相關(guān)語句。本篇學(xué)習(xí)目標(biāo)學(xué)完本篇后你將能夠區(qū)分 while、do-while、for 三種循環(huán)的語法格式與適用場景使用嵌套循環(huán)解決二維數(shù)組遍歷等實際問題正確使用 break 和 continue 控制循環(huán)流程。本篇講解內(nèi)容1. while循環(huán)do-while循環(huán)for循環(huán)及其對比2. 循環(huán)的嵌套。3. break和continue在上述循環(huán)中的用法。在我們?nèi)粘I钪薪?jīng)常需要重復(fù)一種判斷及執(zhí)行語句多次例如連續(xù)求和次數(shù)累加等等。所以C語言提供了三種循環(huán)下面我一一講解。一. 循環(huán)語句1. while循環(huán)while循環(huán)的格式while(表達(dá)式) { (循環(huán)體) }運行模式先判斷表達(dá)式真則執(zhí)行循環(huán)體假則跳出循環(huán)。例子#define _CRT_SECURE_NO_WARNINGS #includestdio.h int a 1; while(a 6) { printf(%d , a); }但是這一個代碼塊在vs2026上是運行不了的因為變量a一直沒有變判斷一直為真則系統(tǒng)會陷入死循環(huán)所以在循環(huán)結(jié)構(gòu)中的變量一般至少有一個在依次循環(huán)結(jié)束后變化。修改代碼#define _CRT_SECURE_NO_WARNINGS #includestdio.h int a 1; while(a 6) { printf(%d , a); a; }每次循環(huán)后a均會加一最終會停止運行結(jié)果打印1 2 3 4 5 。2. do_while循環(huán)但我們做一些小游戲的時候一般需要先打印菜單后選擇選項一確定是否進(jìn)入例如一個猜字游戲菜單void menu() { printf(*****************************\n); printf(**********1-開始游戲*********\n); printf(*****************************\n); printf(**********0-退出游戲*********\n); printf(*****************************\n); printf(請選擇); }而大部分游戲具有循環(huán)性所以我們需要用循環(huán)語句實現(xiàn)所以步驟是打印菜單-選擇-1-開始游戲-結(jié)束-打印菜單-選擇-1......|-0-退出游戲 |-0......那么需要先執(zhí)行相關(guān)命令再循環(huán)則單獨的while循環(huán)語句不能實現(xiàn)就要do_while循環(huán)語句其結(jié)構(gòu)是do { 循環(huán)體; }while(判斷表達(dá)式);所以上面提到的猜數(shù)字游戲可以這樣寫int main() { int input 0; do { menu(); scanf(%d, input); switch (input) { case 1: game(); break; case 0: printf(游戲結(jié)束\n); break; default: printf(輸入錯誤請重新輸入\n); } } while (input); return 0; }game和menu一樣都是函數(shù)調(diào)用這里的實現(xiàn)不在詳解有興趣可以看一看我的代碼庫https://gitee.com/maomaocyuyan/code_small-project/blob/master/猜數(shù)字游戲/猜數(shù)字游戲/猜數(shù)字.c易忽略1.do后面一般有大括號2.while(判斷語句)后有分號。總結(jié)while語句是先判斷再執(zhí)行而do_while實現(xiàn)執(zhí)行后判斷。3. for循環(huán)for循環(huán)可以說是最常用的循環(huán)其基本結(jié)構(gòu)for(初始化;判斷表達(dá)式;變量調(diào)整) { 循環(huán)體; }相比while循環(huán)for循環(huán)更加簡練且更具有易讀性。但是(初始化;判斷表達(dá)式;變量調(diào)整)中的三個部分均可以選擇性地省略但判斷表達(dá)式和變量調(diào)整一定要在循環(huán)體中體現(xiàn)例如下面兩種寫法基本等價for(int i0;i10;i) { printf(%d,i); } //等價于 int i 0; for (;;) { printf(%d , i); i; if (i 10) break; }但是第一種寫法的整型變量i是臨時變量生命周期和作用域均在其所在的for循環(huán)語句中循環(huán)結(jié)束后便自行銷毀。4. 三者對比循環(huán)類型語法格式執(zhí)行順序適用場景典型示例優(yōu)點缺點whilewhile(表達(dá)式) { 循環(huán)體; }先判斷表達(dá)式真則執(zhí)行循環(huán)體假則跳出循環(huán)。循環(huán)次數(shù)不確定需要先判斷再執(zhí)行的情況。while(a 6) { printf(%d , a); a; }結(jié)構(gòu)簡單邏輯清晰適合條件控制的循環(huán)。若循環(huán)體內(nèi)忘記修改變量容易造成死循環(huán)。do-whiledo { 循環(huán)體; } while(表達(dá)式);先執(zhí)行一次循環(huán)體再判斷表達(dá)式真則繼續(xù)循環(huán)假則退出。至少需要執(zhí)行一次循環(huán)體的情況如菜單打印、游戲主循環(huán)。do { menu(); scanf(%d, input); } while(input);保證循環(huán)體至少執(zhí)行一次適合先執(zhí)行后判斷的場景。循環(huán)體至少執(zhí)行一次若條件一開始就不滿足也會多執(zhí)行一次。forfor(初始化; 判斷表達(dá)式; 變量調(diào)整) { 循環(huán)體; }先執(zhí)行初始化再判斷表達(dá)式真則執(zhí)行循環(huán)體然后執(zhí)行變量調(diào)整再判斷表達(dá)式如此循環(huán)。循環(huán)次數(shù)明確或已知范圍的情況如遍歷數(shù)組、累加求和。for(int i 0; i 10; i) { printf(%d, i); }語法簡練初始化、判斷、調(diào)整集中在一行可讀性強。三個部分均可省略但若省略不當(dāng)容易造成死循環(huán)或邏輯混亂。二. 嵌套使用舉一個最典型的例子二維數(shù)組的遍歷int main() { int arr[3][5] { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 }; for (int i 0;i 3;i) { for (int j 0;j 5;j) { printf(%d , arr[i][j]); } printf(\n); } return 0; }先進(jìn)入一層循環(huán)然后再進(jìn)入二層循環(huán)這實現(xiàn)了二維數(shù)組的遍歷及打印。其他嵌套同理不再贅述。三. break和continue1. breakbreak用于立即終止當(dāng)前所在的循環(huán)跳出循環(huán)體繼續(xù)執(zhí)行循環(huán)之后的代碼。下面分別針對三種循環(huán)給出示例。1while循環(huán)中的breakint a 1; while (a 10) { if (a 5) break; printf(%d , a); a; }執(zhí)行效果當(dāng)a遞增到5時break語句立即終止while循環(huán)不再執(zhí)行后續(xù)的a和printf因此只打印1 2 3 4。適用場景循環(huán)次數(shù)不確定但需要在滿足某個特定條件時提前結(jié)束循環(huán)例如在查找數(shù)據(jù)時找到目標(biāo)就立即退出。2do-while循環(huán)中的breakint input 0; do { scanf(%d, input); if (input 0) break; printf(你輸入的是%d\n, input); } while (1);執(zhí)行效果do-while先執(zhí)行一次循環(huán)體當(dāng)用戶輸入0時break立即終止循環(huán)即使while(1)條件恒為真也不會繼續(xù)執(zhí)行。適用場景菜單選擇、游戲主循環(huán)等需要先執(zhí)行一次再判斷的場景配合break實現(xiàn)退出功能。3for循環(huán)中的breakfor (int i 0; i 10; i) { if (i 5) break; printf(%d , i); }執(zhí)行效果當(dāng)i遞增到5時break立即終止for循環(huán)不再執(zhí)行后續(xù)的i和printf因此只打印0 1 2 3 4。適用場景循環(huán)次數(shù)明確但需要在滿足某個條件時提前結(jié)束例如遍歷數(shù)組時找到目標(biāo)元素就停止。2. continuecontinue用于跳過本次循環(huán)中continue之后剩余的語句直接進(jìn)入下一次循環(huán)的判斷。下面分別針對三種循環(huán)給出示例。1while循環(huán)中的continueint a 0; while (a 6) { a; if (a 3) continue; printf(%d , a); }執(zhí)行效果當(dāng)a等于3時continue跳過printf語句直接進(jìn)入下一次循環(huán)判斷因此不打印3其余數(shù)字正常打印。適用場景需要跳過某些特定值不處理但循環(huán)本身繼續(xù)執(zhí)行的情況。2do-while循環(huán)中的continueint a 0; do { a; if (a 3) continue; printf(%d , a); } while (a 6);執(zhí)行效果當(dāng)a等于3時continue跳過printf語句直接進(jìn)入while(a 6)的判斷因此不打印3其余數(shù)字正常打印。適用場景至少執(zhí)行一次循環(huán)體同時需要跳過某些特定值不處理的情況。3for循環(huán)中的continuefor (int i 0; i 6; i) { if (i 3) continue; printf(%d , i); }執(zhí)行效果當(dāng)i等于3時continue跳過printf語句直接執(zhí)行i進(jìn)入下一次循環(huán)因此不打印3其余數(shù)字正常打印。適用場景循環(huán)次數(shù)明確需要跳過某些特定值不處理例如統(tǒng)計時排除無效數(shù)據(jù)。