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

C語言循環結構詳解:while、do-while 與 for 迴圈完全指南

     編輯:關於C語言

循環結構核心概念

循環結構是程式設計中不可或缺的控制流程機制,其核心在於「在給定條件成立時,重複執行特定程式區塊,直到條件不成立為止」。這個給定條件稱為循環條件,被重複執行的程式區塊則稱為循環體。C 語言提供了 while、do-while 和 for 三種主要循環語句,靈活構建各種迴圈邏輯。

while 迴圈:先判斷後執行

基本語法與語義

while (表達式) 語句;

表達式 即循環條件,語句 為循環體。執行流程:先計算表達式的值,若為真(非零),則執行循環體;執行完畢後再次判斷條件,以此類推。

範例:統計輸入字元數

#include <stdio.h>
void main() {
    int n = 0;
    printf("input a string:\n");
    while (getchar() != '\n') n++;
    printf("%d", n);
}

此處循環條件 getchar() != '\n' 表示:只要讀取的字元不是換行符,就持續循環,n++ 完成計數。

while 使用關鍵點

  1. 條件表達式:通常為關係或邏輯表達式,值為真(非零)即持續循環。
  2. 複合語句:循環體若包含多條語句,必須用 {} 括起形成複合語句。
  3. 避免死循環:需確保循環條件最終會變為假。例如 while(a=5) 因賦值表達式恆為真,且循環體無跳出機制,將導致死循環。
  4. 巢狀循環:允許 while 循環體內再包含 while,形成多重循環。

do-while 迴圈:先執行後判斷

基本語法與語義

do
    語句;
while (表達式);

執行流程:先無條件執行一次循環體,再判斷條件,若為真則繼續循環。因此 do-while 至少執行一次循環體,這是它與 while 的本質區別。

範例:輸出偶數序列

void main() {
    int a = 0, n;
    printf("\n input n: ");
    scanf("%d", &n);
    do printf("%d ", a++ * 2);
    while (--n);
}

注意:條件改為 --n 而非 n--,因為先執行後判斷的特性會導致多執行一次。

do-while 使用注意事項

  1. 條件表達式後必須加分號,這與 if、while 不同。
  2. 可構成多重循環,也可與 while 相互嵌套。
  3. 循環體多條語句時同樣需用 {} 括起。
  4. 與 while 互換時,需修改循環控制條件以保持邏輯等價。

for 迴圈:功能最強、應用最廣

一般形式與三大表達式

for (表達式1; 表達式2; 表達式3)
    語句;
  • 表達式1:通常給循環變數賦初值(賦值表達式),可省略(在循環外初始化)。
  • 表達式2:循環條件(關係/邏輯表達式),值為真則執行循環體,否則跳出。可省略(視為永真,需在循環體內跳出)。
  • 表達式3:修改循環變數值(通常為賦值表達式),可省略(在循環體內修改)。

三表達式皆可為逗號表達式(含多個子表達式),皆為可選項。

執行流程

  1. 計算表達式1(僅一次)。
  2. 計算表達式2,為真則執行循環體,否則結束循環。
  3. 執行表達式3,回到第2步。

經典範例:計算 1+2+...+100

void main() {
    int n, s = 0;
    for (n = 1; n <= 100; n++)
        s = s + n;
    printf("s=%d\n", s);
}

進階用法示範

省略表達式1、逗號表達式

void main() {
    int a = 0, n;
    printf("\n input n: ");
    scanf("%d", &n);
    for (; n > 0; a++, n--)
        printf("%d ", a * 2);
}

表達式1省略(初值由 scanf 取得),表達式3為逗號表達式 a++, n--,雙重控制。

全部省略、在循環體內控制

void main() {
    int a = 0, n;
    printf("\n input n: ");
    scanf("%d", &n);
    for (;;) {
        a++; n--;
        printf("%d ", a * 2);
        if (n == 0) break;
    }
}

等效於 while(1),若無 break 則為死循環。

空循環體

#include <stdio.h>
void main() {
    int n = 0;
    printf("input a string:\n");
    for (; getchar() != '\n'; n++);
    printf("%d", n);
}

計數移至表達式3,循環體為空語句(僅一分號)。注意:空語句分號不可省,否則後續語句會被視為循環體;反之,循環體非空時,括號後加分號會導致循環體為空,造成邏輯錯誤。

for 迴圈嵌套與多重循環

for 可與 while、do-while 任意嵌套,常見形式:

(1) for() { ... while() {...} ... }
(2) do { ... for() {...} ... } while();
(3) while() { ... for() {...} ... }
(4) for() { ... for() {...} ... }

範例:印製金字塔圖案

void main() {
    int i, j, k;
    for (i = 1; i <= 3; i++) {
        for (j = 1; j <= 3 - i + 5; j++)
            printf(" ");
        for (k = 1; k <= 2 * i - 1 + 5; k++) {
            if (k <= 5) printf(" ");
            else printf("*");
        }
        printf("\n");
    }
}

總結比較

循環類型判斷時機最少執行次數適用場景
while先判斷後執行0循環次數未知,需先檢查條件
do-while先執行後判斷1至少需執行一次,如選單輸入驗證
for先判斷後執行0循環次數明確或需初始化/遞增的計數循環

靈活掌握三種循環,並注意邊界條件、死循環預防與巢狀結構設計,是編寫高效 C 程式的關鍵基礎。

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