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

C 語言流程控制語句完整指南:條件判斷與迴圈實戰

     編輯:關於C語言

前言

流程控制是程式設計的核心骨架,決定了程式碼的執行順序與邏輯走向。在 C 語言中,主要分為「分支語句」與「迴圈語句」兩大類。掌握它們的語法細節、執行機制與常見陷阱,能讓你寫出更健壯、高效的程式。本文將系統整理 if/else、switch/case、for、while、do-while 的用法,並搭配實戰範例與注意事項,助你建立扎實的控制流基礎。

一、分支語句:根據條件選擇執行路徑

1. if / else 結構

if/else 是最基礎、也是最常用的條件判斷語句。其基本骨架如下:

if (邏輯表達式條件1) {
    // 滿足條件1 時執行的語句
} else if (邏輯表達式條件2) {
    // 滿足條件2 時執行的語句
} else {
    // 以上條件都不滿足時執行的語句
}
  • 關鍵特性: if/else 鏈條只會執行其中一個分支。一旦某分支條件成立,後續分支皆被跳過。若執行到第 n 個分支,意味著前 n-1 個條件皆為假。
  • else 的必要性: 帶 else 的結構「必選其一」執行;無 else 則為「可選其一」。
  • 大括號省略規則: 分支內僅有一條語句時,{} 可省略。但涉及 break、continue、return 等跳轉語句時,習慣上仍建議保留大括號以提升可讀性。
  • 邊界條件處理: 邏輯判斷務必考慮臨界值(如 0、最大值、最小值),避免 off-by-one 錯誤。

實戰範例:判斷整數正負與零

int a;
scanf("%d", &a);
if (a > 0) {
    printf("%d 是正數\n", a);
} else if (a == 0) {
    printf("%d 是零\n", a);
} else {
    printf("%d 是負數\n", a);
}

進階範例:計算某年某月天數(含閏年判斷)

#include <stdio.h>
int main() {
    int y, m, maxDay = 31;
    printf("請輸入年 月:");
    scanf("%d%d", &y, &m);

    if (m < 1 || m > 12) {
        printf("輸入非法\n");
        return -1;
    }

    if (m == 4 || m == 6 || m == 9 || m == 11) {
        maxDay = 30;
    } else if (m == 2) {
        // 閏年規則:能被 4 整除但不能被 100 整除,或能被 400 整除
        maxDay = 28 + ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0));
    }
    printf("%d 年 %d 月有 %d 天\n", y, m, maxDay);
    return 0;
}

2. switch / case 多重選擇

當需針對同一整數型表達式進行多值比對時,switch 結構更清晰:

switch (控制表達式) {
    case 常量表達式1: 語句; break;
    case 常量表達式2: 語句; break;
    ...
    default: 語句;
}
  • 控制表達式 必須為整數類型(含 char),不可為浮點數或字串。
  • case 標籤 必須為編譯期常量(如 3、'A'、2+5),且值不可重複。
  • 執行機制(貫穿特性): 程式會從匹配的 case 開始向下執行,直到遇到 break 或結束大括號。若省略 break,會「貫穿」執行後續 case。
  • default 位置可任意,慣例置於最後。

範例:簡單選單

int a = 2;
switch (a) {
    case 1: printf("選項 1\n"); break;
    case 2: printf("選項 2\n"); break;
    case 3: printf("選項 3\n"); break;
    default: printf("無效選項\n");
}

二、迴圈語句:重複執行直到條件不滿足

1. for 迴圈——次數已知或可預計的首選

for (初始化語句1; 條件判斷2; 步進語句3) {
    // 迴圈體 4
}

執行順序: 1 → 2(真) → 4 → 3 → 2(真) → 4 → 3 → … → 2(假) → 結束。

經典用法

// 固定次數
for (int i = 0; i < 10; i++) {
    printf("%d ", i);
}

// 死循環(無限循環)
for (;;) { /* 需配合 break 退出 */ }

// C99 支援在迴圈內宣告變數:for (int i = 0; ...)

實戰:輸入分數計算總分、平均、最高分(次數不定,-1 結束)

#include <stdio.h>
int main() {
    int sum = 0, max = 0x80000000, num = 0, temp;
    for (;;) {
        scanf("%d", &temp);
        if (temp == -1) break;
        sum += temp;
        if (temp > max) max = temp;
        num++;
    }
    printf("總分=%d, 平均=%.2f, 最高分=%d\n", sum, 1.0 * sum / num, max);
    return 0;
}

2. while 迴圈——條件前置,適合次數未知情境

初始化;
while (條件) {
    迴圈體;
    步進;
}

與 for 互通,語意上更強調「當條件成立時持續執行」。

範例:累加輸入直到 0

int sum = 0, temp;
while (1) {
    printf("請輸入數字(0 結束):");
    scanf("%d", &temp);
    if (temp == 0) break;
    sum += temp;
}
printf("總和 = %d\n", sum);

3. do-while 迴圈——至少執行一次的後置判斷

初始化;
do {
    迴圈體;
    步進;
} while (條件);  // 注意分號

適用於「先執行再判斷」的場景,如選單顯示、輸入驗證。

範例:計算整數位數

int num, count = 0;
printf("請輸入一個整數:");
scanf("%d", &num);
do {
    num /= 10;
    count++;
} while (num != 0);
printf("位數:%d\n", count);

三、迴圈控制關鍵字:break 與 continue

關鍵字作用範圍行為
break迴圈 / switch立即跳出所在層迴圈或 switch;若為巢狀迴圈,僅跳出內層。
continue迴圈內部結束本次迴圈,直接進入下一次條件判斷。
return函數結束整個函數,返回調用處。

四、巢狀迴圈與二維圖形列印技巧

巢狀迴圈常用於多維資料處理或圖形列印。內層迴圈次數控制的通用公式(外層 i 從 0 起始,步進 1):

j < m * i + n

  • m:內層每輪遞增量(遞減取負)
  • n:內層第一輪執行次數

範例 1:等腰三角形

for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 2 * i + 1; j++) printf("*");
    printf("\n");
}

範例 2:九九乘法表

for (int i = 1; i < 10; i++) {
    for (int j = 1; j <= i; j++) {
        printf("%d*%d=%-3d ", j, i, j * i);
    }
    printf("\n");
}

五、總結與最佳實踐

  1. 優先選擇語意最貼切的結構: 次數固定用 for、條件前置用 while、至少一次用 do-while、多值比對用 switch。
  2. 警惕邊界與死循環: 條件判斷務必有明確的變化趨勢,避免 for(;;) 或 while(1) 缺乏 break。
  3. 善用 break/continue 簡化邏輯: 但避免過度使用導致流程難以追蹤。
  4. 巢狀迴圈控制變數命名要清晰: 外層 i/row,內層 j/col。
  5. 編譯器警告是朋友: 開啟 -Wall -Wextra,捕捉條件判斷常量、變數未初始化等隱患。

熟練掌握流程控制,是邁向演算法與系統程式設計的基石。建議動手修改上述範例,觀察不同輸入下的行為差異,將知識內化為肌肉記憶。

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