From Gossip@Openhome

C Gossip: while 迴圈

C提供while迴圈式,它根據您所指定的條件式來判斷是否執行迴圈本體,語法如下所示:
while (條 件式) {
    陳述句一;
    陳述句二;
}

如果迴圈本體只有一個陳述句,則while的{ }可以省略不寫;while有些像是沒有起始陳述與終止陳述的for迴圈,它通常用於重複性的動作,而停止條件未知何時發生的情況,例如一個使用者輸入介 面,使用者可能輸入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迴圈,這個break與switch中的作用是一樣的,都是要離開當時的程式區塊時使用。

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());

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