From Gossip@Openhome

Java Gossip: while 迴圈 

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

如果迴圈本體只有一個陳述句,則while的{ }可以省略不寫;while有些像是沒有起始陳述與終止陳述的for迴圈,它通常用於重複性的動作,而停止條件未知何時發生的情況,例如一個使用者輸入介 面,使用者可能輸入10次,也可能輸入20次,這時迴圈停止的時機是未知的,您可以使用while迴圈來作這個事。

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

  • Average.java
import java.util.Scanner;

public class Average {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int score = 0;
int sum = 0;
int count = -1;

while(score != -1) {
count++;
sum += score;
System.out.print("輸入分數(-1結束):");
score = scanner.nextInt();
}

System.out.println("平均:" + (double)sum/count);
}
}

執行結果:
輸入分數(-1結束):98
輸入分數(-1結束):76
輸入分數(-1結束):83
輸入分數(-1結束):67
輸入分數(-1結束):77
輸入分數(-1結束):-1
平均:80.2


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

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

無窮迴圈可以由自己迴圈中的某個條件式來結束,也可以由外部程式的終止或函式呼叫的終止來結束,例如下面是一個迴圈內部終止的例子:
while(true) {
    陳述句;
   
    if(條件式)
        break;  // 跳離迴圈

     ....
}

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

while迴圈稱之為「前測式迴圈」,因為它在迴圈執行前就會進行條件判斷,而do while稱之「後測式迴圈」,它會先執行迴圈本體,然後再進行條件判斷,do while的語法如下所示:
do {
    陳述句一;
    陳述句二;
    ....
} while(條件式);

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

  • Odd.java
import java.util.Scanner;

public class Odd {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int input = 0;
int replay = 0;

do {
System.out.print("輸入整數值:");
input = scanner.nextInt();
System.out.println("輸入數為奇數?" +
((input%2 == 1) ? 'Y': 'N'));
System.out.print("繼續(1:繼續 0:結束)?");
replay = scanner.nextInt();
} while(replay == 1);
}
}

執行結果:
輸入整數值:3
輸入數為奇數?Y
繼續(1:繼續 0:結束)?1
輸入整數值:4
輸入數為奇數?N
繼續(1:繼續 0:結束)?0


如果您日後學會類別成員方法的使用,您還可以將這個迴圈寫的更漂亮一些,而不用使用replay變數,例如若下面again()方法詢問使用者是否繼續,如果是會傳回true,否則傳回false:
do {
   System.out.print("輸入整數值:");
   input = scanner.nextInt();
   System.out.println("輸入數為奇數?" +
                       ((input%2 == 1) ? 'Y': 'N'));
} while(again());

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