while 迴圈


C 提供 while 迴圈式,它根據您所指定的條件式來判斷是否執行迴圈本體,語法如下所示:

while(條件式) { 
    陳述句一; 
    陳述句二; 
}

如果迴圈本體只有一個陳述句,則 while{} 可以省略不寫,然而基於可讀性,建議還是寫出來;while 主要用於結束條件發生時機無法確定的重複性動作,例如一個使用者輸入介面,使用者可能輸入 10 次,也可能輸入 20 次,這時迴圈停止的時機是未知的,您可以使用 while 迴圈來作這個事。

一個計算輸入成績平均的程式如下所示:

#include <stdio.h>

int main(void) {
    int score = 0; 
    int sum = 0; 
    int count = -1; 

    while(score != -1) { 
        count++; 
        sum += score; 
        printf("輸入分數(-1結束):");
        scanf("%d", &score);
    } 

    printf("平均:%f\n", (double) sum / count ); 

    return 0;
}

執行結果:

輸入分數(-1結束):87
輸入分數(-1結束):77
輸入分數(-1結束):99
輸入分數(-1結束):-1
平均:87.666667

在這個程式中,使用者的輸入次數是未知的,所以使用 while 迴圈來判斷使用者的輸入是否為 -1,以作為迴圈執行的條件。

while 可以用作無窮迴圈,無窮迴圈並不是不能用,事實上很多地方都用到的到無窮迴圈,例如遊戲設計中對使用者輸入裝置的輪詢(poll),或是動畫程 式的播放,一個無窮迴圈如下所示:

while(1) { 
    迴圈內容; 
    .... 
}

無窮迴圈可以由自己迴圈中的某個條件式來結束,也可以由外部程式的終止或函式呼叫的終止來結束,例如下面是一個迴圈內部終止的例子:

while(1) { 
    陳述句; 

    if(條件式) { 
        break;  // 跳離迴圈
    } 
     .... 
}

當條件式成立時,會執行 break 離開 while 迴圈,這個 breakswitch 中的作用是一樣的,都是要離開當時的程式區塊時使用。

while 迴圈常被稱為前測式迴圈,因為它在迴圈執行前就會進行條件判斷,而 do while 稱之後測式迴圈,它會先執行迴圈本體,然後再進行條件判斷,do while 的語法如下所示:

do { 
    陳述句一; 
    陳述句二; 
    .... 
} while(條件式);

注意 while 後面是以分號(;)作為結束,這個很常被忽略;由於 do while 會先執行迴圈,所以它通常用於進行一些初始化或介面溝通的動作,例如下面這個程式:

#include <stdio.h>

int main(void) {
    int input = 0;
    int replay = 0;

    do {
        printf("輸入整數值:");
        scanf("%d", &input);
        getchar();

        printf("輸入數為奇數?%c\n", ((input % 2) ? 'Y': 'N'));
        printf("繼續(1:繼續 0:結束)?");
        scanf("%d", &replay);
        getchar();
    } while(replay);

    return 0;
}

執行結果:

輸入整數值:11
輸入數為奇數?Y
繼續(1:繼續 0:結束)?0

如果日後學會函式的使用,可以將這個迴圈寫的更漂亮一些,而不用使用 replay 變數,例如若下面 more() 函式詢問使用者是否繼續,如果是會傳回1,否則傳回 0:

do { 
   printf("輸入整數值:"); 
   scanf("%d", &input); 
   printf("輸入數為奇數?%c\n", ((input % 2) ? 'Y': 'N')); 
} while(more());

一個小小的改變,就可以使程式更為簡潔,邏輯上也較為清楚。