java 迴圈語句(轉)

ba發表於2007-08-15
java 迴圈語句(轉)[@more@]Java 的迴圈語句有for,while 和 do-while 。這些語句創造了我們通常所稱的迴圈(loops)。你可能知道,一個迴圈重複執行同一套指令直到一個結束條件出現。你將看到,Java 有適合任何程式設計所需要的迴圈結構。

5.2.1 while 語句
while 語句是Java 最基本的迴圈語句。當它的控制表示式是真時,while 語句重複執行一個語句或語句塊。它的通用格式如下:

while(condition) {
// body of loop
}

條件condition 可以是任何布林表示式。只要條件表示式為真,迴圈體就被執行。當條件condition 為假時,程式控制就傳遞到迴圈後面緊跟的語句行。如果只有單個語句需要重複,大括號是不必要的。

下面的while 迴圈從10開始進行減計數,列印出10行“tick”。

// Demonstrate the while loop.
class While {
public static void main(String args[]) {
int n = 10;

while(n > 0) {
System.out.println("tick " + n);
n--;

}
}
}

當你執行這個程式,它將“tick”10次:

tick 10
tick 9
tick 8
tick 7
tick 6
tick 5
tick 4
tick 3
tick 2
tick 1

因為while 語句在迴圈一開始就計算條件表示式,若開始時條件為假,則迴圈體一次也不會執行。例如,下面的程式中,對println( ) 的呼叫從未被執行過:

int a = 10, b = 20;

while(a > b)
System.out.println("This will not be displayed");

while 迴圈(或Java 的其他任何迴圈)的迴圈體可以為空。這是因為一個空語句(null statement) (僅由一個分號組成的語句)在Java 的語法上是合法的。例如,下面的程式:

// The target of a loop can be empty.
class NoBody {
public static void main(String args[]) {
int i, j;

i = 100;
j = 200;

// find midpoint between i and j
while(++i < --j) ; // no body in this loop

System.out.println("Midpoint is " + i);
}
}

該程式找出變數i和變數j的中間點。它產生的輸出如下:

Midpoint is 150

該程式中的while 迴圈是這樣執行的。值i自增,而值j自減,然後比較這兩個值。如果新的值i仍比新的值j小,則進行迴圈。如果i等於或大於j,則迴圈停止。在退出迴圈前, i 將儲存原始i和j的中間值(當然,這個程式只有在開始時i比j小的情況下才執行)。正如你看到的,這裡不需要迴圈體。所有的行為都出現在條件表示式自身內部。在專業化的Java 程式碼中,一些可以由控制表示式本身處理的短迴圈通常都沒有迴圈體。

5.2.2 do-while 迴圈
如你剛才所見,如果while 迴圈一開始條件表示式就是假的,那麼迴圈體就根本不被執行。然而,有時需要在開始時條件表示式即使是假的情況下,while 迴圈至少也要執行一次。換句話說,有時你需要在一次迴圈結束後再測試中止表示式,而不是在迴圈開始時。幸運的是,Java 就提供了這樣的迴圈:do-while 迴圈。do-while 迴圈總是執行它的迴圈體至少一次,因為它的條件表示式在迴圈的結尾。它的通用格式如下:

do {
// body of loop
} while (condition);

do-while 迴圈總是先執行迴圈體,然後再計算條件表示式。如果表示式為真,則迴圈繼續。否則,迴圈結束。對所有的Java 迴圈都一樣,條件condition 必須是一個布林表示式。下面是一個重寫的“tick”程式,用來演示do-while 迴圈。它的輸出與先前程式的輸出相同。

// Demonstrate the do-while loop.
class DoWhile {
public static void main(String args[]) {
int n = 10;

do {
System.out.println("tick " + n);
n--;

} while(n > 0);
}
}
該程式中的迴圈雖然在技術上是正確的,但可以像如下這樣編寫更為高效:

do {
System.out.println("tick " + n);
} while(--n > 0);

在本例中,表示式“-- n > 0 ”將n值的遞減與測試n是否為0組合在一個表示式中。它的執行過程是這樣的。首先,執行-- n 語句,將變數n遞減,然後返回n的新值。這個值再與0比較,如果比0大,則迴圈繼續。否則結束。

do-while 迴圈在你編制選單選擇時尤為有用,因為通常都想讓選單迴圈體至少執行一次。下面的程式是一個實現Java 選擇和重複語句的很簡單的幫助系統:

// Using a do-while to process a menu selection
class Menu {

public static void main(String args[])
throws java.io.IOException {
char choice;

do {
System.out.println("Help on:");
System.out.println(" 1. if");
System.out.println(" 2. switch");
System.out.println(" 3. while");
System.out.println(" 4. do-while");
System.out.println(" 5. for ");
System.out.println("Choose one:");
choice = (char) System.in.read();

} while( choice < '1' || choice > '5');

System.out.println(" ");

switch(choice) {

case '1':
System.out.println("The if: ");
System.out.println("if(condition) statement;");
System.out.println("else statement;");

break;

case '2':
System.out.println("The switch: ");
System.out.println("switch(expression) {");
System.out.println(" case constant:");
System.out.println(" statement sequence");
System.out.println(" break;");
System.out.println(" // ...");
System.out.println("}");
break;

case '3':
System.out.println("The while: ");
System.out.println("while(condition) statement;");
break;

case '4':
System.out.println("The do-while: ");
System.out.println("do {");
System.out.println(" statement;");
System.out.println("} while (condition);");
break;

case '5':
System.out.println("The for: ");
System.out.print("for(init; condition; iteration)");
System.out.println(" statement;");
break;

}
}
}

下面是這個程式執行的一個樣本輸出:

Help on:

1. if
2. switch
3. while
4. do-while
5. for
Choose one:
4
The do-while:
do {

statement;
} while (condition);

在程式中,do-while 迴圈用來驗證使用者是否輸入了有效的選擇。如果沒有,則要求使用者重新輸入。因為選單至少要顯示一次,do-while 迴圈是完成此任務的合適語句。

關於此例的其他幾點:注意從鍵盤輸入字元透過呼叫System.in.read( ) 來讀入。這是一個Java 的控制檯輸入函式。儘管Java 的終端 I/O (輸入/輸出)方法將在第12章中詳細討論,在這裡使用System.in.read ( ) 來讀入使用者的選擇。它從標準的輸入讀取字元(返回整數,因此將返回值choice 定義為字元型)。預設地,標準輸入是按行進入緩衝區的,因此在你輸入的任何字元被送到你的程式以前,必須按Enter鍵。

Java 的終端輸入功能相當有限且不好使用。進一步說,大多數現實的Java 程式和applets (小應用程式)都具有圖形介面並且是基於視窗的。因此,這本書使用終端的輸入並不多。然而,它在本例中是有用的。另外一點:因為使用 System.in.read ( ) ,程式必須指定throws java.io.IOException 子句。這行程式碼對於處理輸入錯誤是必要的。這是Java 的異常處理的一部分,將在第10章討論。

5.2.3 for 迴圈
在第2章曾使用過一個for迴圈的簡單格式。你將看到,for迴圈是一個功能強大且形式靈活的結構。下面是for 迴圈的通用格式:

for(initialization; condition; iteration) {
// body
}

如只有一條語句需要重複,大括號就沒有必要。
for迴圈的執行過程如下。第一步,當迴圈啟動時,先執行其初始化部分。通常,這是設定迴圈控制變數值的一個表示式,作為控制迴圈的計數器。重要的是你要理解初始化表示式僅被執行一次。下一步,計算條件condition 的值。條件condition 必須是布林表示式。它通常將迴圈控制變數與目標值相比較。如果這個表示式為真,則執行迴圈體;如果為假,則迴圈終止。再下一步執行迴圈體的反覆部分。這部分通常是增加或減少迴圈控制變數的一個表示式。接下來重複迴圈,首先計算條件表示式的值,然後執行迴圈體,接著執行反覆表示式。這個過程不斷重複直到控制表示式變為假。

下面是使用for 迴圈的“tick”程式:

// Demonstrate the for loop.
class ForTick {
public static void main(String args[]) {
int n;

for(n=10; n>0; n--)
System.out.println("tick " + n);
}
}

在for 迴圈中宣告迴圈控制變數

控制for迴圈的變數經常只是用於該迴圈,而不用在程式的其他地方。在這種情況下,可以在迴圈的初始化部分中宣告變數。例如,下面重寫了前面的程式,使變數 n 在for迴圈中被宣告為整型:

// Declare a loop control variable inside the for.
class ForTick {
public static void main(String args[]) {

// here, n is declared inside of the for loop
for(int n=10; n>0; n--)
System.out.println("tick " + n);
}
}

當你在for 迴圈內宣告變數時,必須記住重要的一點:該變數的作用域在for語句執行後就結束了(因此,該變數的作用域就侷限於for 迴圈內)。在for迴圈外,變數就不存在了。如果你在程式的其他地方需要使用迴圈控制變數,你就不能在for迴圈中宣告它。

由於迴圈控制變數不會在程式的其他地方使用,大多數程式設計師都在for迴圈中來宣告它。例如,以下為測試素數的一個簡單程式。注意由於其他地方不需要i,所以迴圈控制變數i在for迴圈中宣告。

// Test for primes.
class FindPrime {

public static void main(String args[]) {
int num;
boolean isPrime = true;

num = 14;
for(int i=2; i <= num/2; i++) {

if((num % i) == 0) {
isPrime = false;
break;

}
}
if(isPrime) System.out.println("Prime");
else System.out.println("Not Prime");

}
}

使用逗號

你可能經常需要在初始化和for迴圈的反覆部分包括超過一個變數的宣告。例如,考慮下面程式的迴圈部分:

class Sample {

public static void main(String args[]) {
int a, b;
b = 4;
for(a=1; a
System.out.println("a = " + a);
System.out.println("b = " + b);
b--;

}
}
}

如你所看到的,迴圈被兩個相互作用的變數控制。由於迴圈被兩個變數控制,如果兩個變數都能被定義在for 迴圈中,而變數b不需要透過人工處理將是很有用的。幸好,Java 提供了一個完成此任務的方法。為了允許兩個或兩個以上的變數控制迴圈,Java 允許你在for 迴圈的初始化部分和反覆部分宣告多個變數,每個變數之間用逗號分開。

使用逗號,前面的for迴圈將更高效,改寫後的程式如下:

// Using the comma.
class Comma {
public static void main(String args[]) {
int a, b;

for(a=1, b=4; a
}
}
}

在本例中,初始化部分把兩個變數a和 b都定義了。在迴圈的反覆部分,用兩個逗號分開的語句在每次迴圈重複時都執行。程式輸出如下:

a = 1
b = 4
a = 2
b = 3
注意:如果你對C/C++ 熟悉,你就會知道逗號是一個運算子,能在任何有效的表達

式中使用。然而,在Java 中不是這樣。在 Java 中,逗號僅僅是一個分隔符,只

適用於for迴圈。

5.2.4 for 迴圈的一些變化
for迴圈支援一些變化,這增加了它的功能和靈活性。for迴圈這樣靈活是因為它的3部分(初始化部分,條件測試部分和反覆部分)並不僅用於它們所限定的那些目的。事實上,for 迴圈的3部分能被用於你需要的任何目的。讓我們看一些例子。

最普通的變化之一包含在條件表示式中。具體地說,條件表示式可以不需要用迴圈變數和目標值的比較來測試迴圈條件。事實上,控制for 迴圈的條件可以是任何布林表示式。例如,考慮下列程式片段:

boolean done = false;

for(int i=1; !done; i++) {

// ...

if(interrupted()) done = true;

}

在本例中,for迴圈將一直執行,直到布林型變數done 被設定為真。for迴圈的條件部分不測試值i。

下面是for迴圈的另外一個有趣的變化。在Java 中可以使for迴圈的初始化、條件或者反覆部分中的任何或者全部都為空,如下面的程式:

// Parts of the for loop can be empty.

class ForVar {

public static void main(String args[]) {

int i;

boolean done = false;

i = 0;

for( ; !done; ) {

System.out.println(" {System.out.println(?a=" + a);System.out.println(" b--) a++, /> System.out.println();
}
}
}

該程式產生的輸出如下所示:

. . . . . . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . .
. . . . . .
. . . . .
. . . .
. . .
. .
.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-958081/,如需轉載,請註明出處,否則將追究法律責任。

相關文章