第四章 控制執行流程
Java中使用了C的所有流程控制語句。在Java中涉及的關鍵字包括if-else,while,do-while,for,return,break,continue以及選擇語句switch。然而Java不支持goto語句(該語句引起了許多的反對意見),但是Java仍然可以類似goto那樣跳轉。
4.1 True和False
所有的條件語句都利用條件表達式的真假來決定執行的路徑。Java中不允許我們將一個數字作爲boolean值使用,雖然C和C++中是允許的(“非零”爲真,”零”爲假)。
4.2 if-else
if-else語句是控制程序流程最基本形式。其中else是可選的。有如下兩種使用的方式:
if(boolean-exp){
...
}
if(boolean-exp){
...
} else {
...
}
4.3迭代
while,do-while,for用來控制循環,有時將她們劃分爲迭代語句(iteration statement)。語句會重複執行直到條件滿足或者條件不滿足。while語句的格式如下:
while(boolean-exp){
...
}
再循環剛開始的時候,會計算一次boolean-exp的值,而在語句的下次迭代開始前會再計算一次。
4.3.1 do-while
do-while和while唯一區別就是do-while中的語句至少會執行一次。
4.3.2 for循環
for循環在第一次迭代之前要進行初始化,之後會進行條件測試,每次循環結束之後都以某種方式步進。
4.3.3 逗號操作符
逗號操作符(不是逗號分隔符),Java中唯一用到逗號操作符的地方就是for循環的控制表達式。在控制表達式的初始化和步進控制部分,可以使用一系列的逗號分隔的語句;
4.4 Foreach語法
Java SE5引入了一種更加簡潔的for語句用於數組和容器,能簡易的遍歷每一項。
public class Test{
public static void main(String[] args){
Random rand = new Random(47);
float f[] = new float[10];
for(int i = 0; i < 10; i ++)
f[i] = rand.nextFloat();
for(floar x : f)
System.out.println(x);
}
}
foreach語句能試用於任何的實現了Iterable接口的對象。使用foreach不僅在錄入代碼時可以節省時間,更重要的是,它閱讀起來也要容易得多,它閱讀起來也要容易得多,閱讀起來能讓人明白正在做什麼,而不是類似於for(int i=0; i<100;i++)
的告訴人如何做的細節。
4.5 return
Java中有如下幾個關鍵詞表示無條件跳轉,return、break、continue和一種類似於其他語言中goto的標記。
return有兩方面的用途:
- 一方面指定一個方法返回什麼值(假設它沒有void返回值)
- 另一方面會導致當前的方法退出,並返回那個值。
4.6 break和continue
在任何迭代語句的主體部分,都可用break和continue控制循環的流程。break關鍵字用於強行退出循環,不執行循環中剩餘的部分。continue則是停止當前執行的一次循環,直接開始下一次的循環迭代。下面的例子:
public class Test {
public static void main(String[] args) {
for(int i=0; i<100; i++) {
if(i == 74) break;
if(i%9 != 0)continue;
System.out.println(i + " ");
}
}
}
上面的輸出結果爲:
0 9 18 27 36 45 54 63 72
到74的時候就break出來了,而當i不能被9整除時,continue(也就是繼續下一次循環)。
4.7 臭名昭著的goto
goto語句實際上起源於彙編程序的程序控制: 若條件A成立,則跳到這裏;否則跳到那裏。如果閱讀由編譯器最終生成的彙編代碼,就會發現程序控制裏面包含了很多的跳轉。(Java編譯器生成它自己的”彙編代碼”,運行在Java虛擬機上面,而不是直接在cpu硬件上面的)。
goto是在源碼級上面的跳轉。不多介紹了,最好不用,用了會使源代碼變的很難閱讀。
4.8 switch
switch有時也被規劃成一種選擇語句。根據整數表達式的值,switch語句可以從一系列代碼中選出一段去執行,格式如下:
switch(integeral-selector) {
case integral-value1 :
statement1 ;
break;
case integral-value2 :
statement2 ;
break;
case integral-value3 :
statement3 ;
break;
default:
statement4;
}
integeral-selecotr是一個能夠產生整數值的表達式,switch能將這個結果與每個integral-value(整數值)相比較。若發現相符的,就執行下面對應的語句。若沒發現相符的語句,就執行default中包含的語句塊。
每個case最後都有一個break;語句這樣可以使執行流程跳轉到switch主體的末尾。如果case中沒有break,則會繼續執行後面的case語句,不管是否滿足case,直到遇見第一個break;爲止。