for循環在第一次反復之前要進行初始化。隨後,它會進行條件測試,而且在每一次反復的時候,進行某種形式的“步進”(Stepping)。for循環的形式如下:
for(初始表達式; 布爾表達式; 步進)
語句
無論初始表達式,布爾表達式,還是步進,都可以置空。每次反復前,都要測試一下布爾表達式。若獲得的結果是false,就會繼續執行緊跟在for語句後面的那行代碼。在每次循環的末尾,會計算一次步進。
for循環通常用於執行“計數”任務:
//: ListCharacters.java // Demonstrates "for" loop by listing // all the ASCII characters. public class ListCharacters { public static void main(String[] args) { for( char c = 0; c < 128; c++) if (c != 26 ) // ANSI Clear screen System.out.println( "value: " + (int)c + " character: " + c); } } ///:~
注意變量c是在需要用到它的時候定義的——在for循環的控制表達式內部,而非在由起始花括號標記的代碼塊的最開頭。c的作用域是由for控制的表達式。
以於象C這樣傳統的程序化語言,要求所有變量都在一個塊的開頭定義。所以在編譯器創建一個塊的時候,它可以為那些變量分配空間。而在Java和C++中,則可在整個塊的范圍內分散變量聲明,在真正需要的地方才加以定義。這樣便可形成更自然的編碼風格,也更易理解。
可在for語句裡定義多個變量,但它們必須具有同樣的類型:
for(int i = 0, j = 1; i < 10 && j != 11; i++, j++) /* body of for loop */;
其中,for語句內的int定義同時覆蓋了i和j。只有for循環才具備在控制表達式裡定義變量的能力。對於其他任何條件或循環語句,都不可采用這種方法。
1. 逗號運算符
早在第1章,我們已提到了逗號運算符——注意不是逗號分隔符;後者用於分隔函數的不同自變量。Java裡唯一用到逗號運算符的地方就是for循環的控制表達式。在控制表達式的初始化和步進控制部分,我們可使用一系列由逗號分隔的語句。而且那些語句均會獨立執行。前面的例子已運用了這種能力,下面則是另一個例子:
//: CommaOperator.java public class CommaOperator { public static void main(String[] args) { for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) { System.out.println("i= " + i + " j= " + j); } } } ///:~
輸出如下:
i= 1 j= 11 i= 2 j= 4 i= 3 j= 6 i= 4 j= 8
大家可以看到,無論在初始化還是在步進部分,語句都是順序執行的。此外,盡管初始化部分可設置任意數量的定義,但都屬於同一類型。