首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言核心筆記(七):循環控制完全指南——while、do-while、for 與跳轉語句

     編輯:關於C

循環語句三大家族

C 語言提供三種循環結構,各有適用場景:

類型判斷時機最少執行次數典型用途
while迴圈前0 次次數未知、條件複雜的迴圈
do-while迴圈後1 次選單輸入、至少執行一次的邏輯
for迴圈前0 次已知次數、計數器驅動的迴圈

1. while 迴圈:前測試循環

語法與流程

while (表達式) {
    循環體語句;
}
  1. 計算表達式值
  2. 非 0 → 執行循環體 → 回步驟 1
  3. 為 0 → 跳出迴圈

經典範例:1 到 100 累加

int i = 1, sum = 0;
while (i <= 100) {
    sum += i;
    i++;
}
printf("sum=%d\n", sum); // 5050

關鍵:變數 `i`、`sum` **必須初始化**;循環體內**必須有趨向結束的語句**(`i++`),否則無限迴圈。

進階範例:a + aa + aaa + ... (x 項)

int a, x;
long sum = 0, tn = 0, n = 1;
scanf("%d%d", &a, &x); // 例:a=2, x=3 → 2+22+222
tn = a;
while (n <= x) {
    sum += tn;
    tn = tn * 10 + a; // 關鍵遞推:2 → 22 → 222
    n++;
}
printf("result is %ld", sum);

2. do-while 迴圈:後測試循環

語法與流程

do {
    循環體語句;
} while (表達式);

**先執行一次**,再判斷條件。適合「至少一次」場景(如選單顯示)。

範例:偶數累加 2+4+...+100

int i = 2, sum = 0;
do {
    sum += i;
    i += 2;
} while (i <= 100);
printf("sum=%d\n", sum); // 2550

while vs do-while 核心差異

int i = 101;
while (i <= 100)  { printf("while 執行\n"); }  // 0 次
do { printf("do-while 執行\n"); } while (i <= 100); // 1 次

3. for 迴圈:計數器驅動的瑞士刀

語法結構

for (表達式1; 表達式2; 表達式3)
    循環體;
  • 表達式1:初始化,僅執行一次
  • 表達式2:條件判斷,非 0 繼續
  • 表達式3:迭代更新,每輪結束執行

標準範例:1 到 100 累加

int sum = 0;
for (int i = 1; i <= 100; i++)
    sum += i;
printf("sum=%d", sum);

for 的特殊靈活性

// 1. 多變數控制
for (int i = 0, j = 10; i < j; i++, j--) { ... }

// 2. 省略表達式(分號不可省)
int i = 1;
for (; i <= 10; ) { printf("%d ", i++); }

// 3. 條件與更新合併
for (int i = 1; i <= 100; sum += i, i++); // 循環體為空

// 4. 判斷質數(旗標變數應用)
int n, m, flag = 1;
scanf("%d", &n);
for (m = 2; m < n && flag; m++)
    if (n % m == 0) flag = 0;
printf(flag ? "%d is prime" : "%d not prime", n);

4. 循環控制語句:break、continue、goto

break:跳出最近一層迴圈或 switch

for (int i = 0; i < 10; i++) {
    printf("%d ", i);
    if (i == 3) break; // 輸出 0 1 2 3 後跳出
}

應用:優化質數判斷——發現因數即 `break`,無需跑完迴圈。

continue:跳過本輪剩餘,直接進入下一輪判斷

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) continue; // 跳過偶數
    printf("%d ", i); // 僅輸出奇數 1 3 5 7 9
}

練習:求 1000 內能被 3、5、7 整除的數(提示:`if (!(i%3==0||i%5==0||i%7==0)) continue;`)。

goto:無條件跳轉(慎用)

int i = 1, s = 0;
loop:
if (i <= 100) {
    s += i;
    i++;
    goto loop; // 等價於 while/for,但破壞結構化
}
printf("1+...+100=%d", s);

合理場景:多層巢狀迴圈需一次跳出最外層(需配合標號),或錯誤處理統一跳轉至清理區塊。

5. 思考與練習題

  1. 用三種迴圈分別實作:階乘、費波那契數列、水仙花數、倒三角星號圖案。
  2. 分析:`for(;;)` 是什麼意思?如何跳出?
  3. 實作:讀取輸入直到 EOF,統計字元/單詞/行數(提示:`while((c=getchar())!=EOF)`)。

常見坑與最佳實踐

錯誤模式後果修正
循環變數未初始化行為未定義宣告時賦值 `int i=0;`
缺少趨向結束語句無限迴圈檢查 `i++`、指標移動等
`scanf` 失敗未清緩衝區死循環讀同一錯誤輸入檢查回傳值,失敗時 `while(getchar()!='\n');`
巢狀迴圈誤用 `break`僅跳出內層用旗標變數或 `goto` 跳出多層
`continue` 用在 `switch` 非迴圈中編譯錯誤`continue` 僅限迴圈

總結

循環是程式「重複執行」的引擎。while 適合條件驅動,do-while 保證首次執行,for 專為計數設計;break/continue 賦予流程細粒度控制,goto 為特殊情況留後門。掌握三者轉換與組合,並養成「初始化→條件→迭代」的肌肉記憶,是寫出高效、可讀 C 代碼的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved