Java基礎:四、控制執行流程
- 2020 年 3 月 17 日
- 筆記
就像有知覺的生物一樣,程式必須在執行過程中控制它的世界,並做出選擇。在Java中,要使用執行控制語句來做出選擇。
在Java中,控制語句涉及的關鍵字包括if-else、while、do-while、for、return、break以及選擇語句switch。
true和false
所有條件語句都利用條件表達式的真或假來決定執行路徑。要注意的是Java不允許我們將一個數字作為布爾值使用。
if-else
if-else語句是控制程式流程的最基本的形式。其中else是可選的,所以可以按下述兩種形式來使用if:
if(Boolean-expression)// 布爾表達式必須產生一個布爾結果 statement // 用分號結尾的簡單語句
或
if(Boolean-expression){ statement }else{ statement }
或
if(Boolean-expression){ statement }else if(Boolean-expression){ statement }else{ statement }
布爾表達式必須產生一個布爾結果,statement指用分號結尾的簡單語句 或複合語句—封閉在花括弧內的一組簡單語句。
迭代
while、do-while和for用來控制循環,稱為迭代語句。語句會重複執行,直到起控制作用的布爾表達式得到假的結果為止。
while
// 在循環剛開始時,會計算一次布爾表達式的值;而在語句的下一次迭代開始前會再計算一次 while(Boolean-expression){ statement }
do-while
do{ statement }while(Boolean-expression)
while和do-while唯一的區別就是do-while中的語句至少會執行一次,即便表達式第一次就被計算為false。而在while循環結構種,如果條件第一次就為false,那麼其中的語句根本不會執行。在實際應用中,while比do-while更常用一些
for
for循環可能是最經常使用的迭代形式,這種第一次迭代之前要進行初始化。隨後,它會進行條件測試,而且在每一次迭代結束時,進行某種形式的「步進」。
for(initializaion;Boolean-expression;step){ statement }
初始化表達式(initializaion)、布爾表達式(Boolean-expression)、或者步進(step)運算,都可以為空,全部為空作用相當於while,但分號不能省略。每次得帶錢會測試布爾表達式。若獲得的結果是false,就會執行for語句後面的程式碼行。每次循環結束,會執行一次步進
class MyTest{ public static void main(String[] args){ for(char c = 0; c < 128;c++){ if(Charscter.isLower(c)){ System.out.println("value: " + (int)c + " character: " + c); } } } }
注意:變數c是在程式用到它的地方被定義的,也就是在for循環的控制表達式里,而不是在main()開始的地方定義的。c的作用於就是for控制的表達式的範圍內。
逗號操作符
逗號操作符(注意不是逗號分隔符,逗號用作分隔符時用來分隔函數的不同參數),Java里唯一用到逗號分隔符的地方就是for循環的控制表達式。在控制表達式的初始化和步進控制部分,可以使用一系列由逗號分隔的語句;而且那些語句均會獨立執行。
通過使用逗號操作符,可以在for語句內定義多個變數,但是它們必須具有相同的類型
class MyTest{ public static void main(String[] args){ for(char c = 0; c < 128;c++){ for(int i = 1,j = i + 10; i < 5; i ++,j = i * 2){ System.out.println("i = " + i + " j = " + j); } } } }
Foreach語法
Java SE5引入了一種新的更加簡潔的for語法用於數組和容器,即foreach語法,表示不必創建int變數去對由訪問項構成的序列進行計數,foreach將自動產生每一項
class MyTest{ 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(float x : f){ Sytem.out.println(x); } } }
for(float x : f) 這條語句定義了一個float類型的變數x,繼而將每一個的f的元素賦值給x
String使用Foreach
String類有一個方法toCharArray(),它返回一個cahr數組,因此可以迭代在字元串裡面的所有字元:
class MyTest{ public static void main(String[] args){ for(char c : "An African Swallow".toCharArray()){ System.out.println(c + " "); } } }
return
return關鍵詞有兩方面的用途:一方面指定一個方法返回什麼值(假設它沒有void返回值),另一方面它會導致當前的方法退出,並返回那個值。
class MyTest{ static int test(int testval,int target){ if(testval > target){ return 1; }else if(testval < target){ return -1; }else{ return 0; } } public static void main(String[] args){ System.out.println(test(10,5)); System.out.println(test(5,10)); System.out.println(test(5,5)); } }
如果在返回void的方法中沒有returan語句,那麼在該方法的結尾處會有一個隱式的return,因為在方法中並非總是必須要有一個return語句。但是,如果一個方法聲明它將返回void之外的其他東西,那麼必須確保每一條程式碼路徑都將返回一個值
break和continue
在任何迭代語句的主題部分,都可用break和continue控制循環的流程。其中breank用於強行退出循環,不執行循環中剩餘的部分。而continue則停止執行當前的迭代,然後退回循環循環起始處,開始下一次迭代
public class MyTest01 { public static void main(String[] args){ for(int i = 0;i < 100;i++){ if(i == 74){ break; } if(i % 9 != 0){ continue; } System.out.print(i + " "); } System.out.println(); int i = 0; while (true){ i ++; int j = i * 27; if(j == 1269){ break; } if(i % 10 != 0){ continue; } System.out.print(i + " "); } } }
例子中還可以看到「無窮循環」的情況。然而,循環內容有一個break語句,可中止循環。除此之外,continue語句執行序列回到循環的開頭,而沒有去完成continue語句之後的所有內容。
無窮循環的第二種形式是for(;;)。編譯器將while(true)與for(;;)看作是同一回事。所以具體選用哪個取決於自己的編程習慣
switch
switch 有時也被劃歸為一種選擇語句。根據整數表達式的值,switch語句可以從一系列程式碼中選出一段去執行。
switch(integral-selector){ case integral-value1 : statement;break; case integral-value2 : statement;break; case integral-value3 : statement;break; case integral-value4 : statement;break; case integral-value5 : statement;break; default: statement; }
其中,integral-selector是一個能夠產生整數值的表達式,switch能將這個表達式的結果與每個integral-value相比較。若發現一致,就執行對應的語句(單一語句或多條語句,其中並不需要括弧)。若沒有發現一致的,就執行default(默認)語句。
在上面的定義中,大家會注意到每個case均以一個break結尾,這樣可使執行流程跳轉至switch主體的末尾。這是構建switch語句的一種傳統方式,但break是可選的。若省略break,會繼續執行後面的case語句,直到遇到一個break為止。注意最後的default語句沒有break,因為執行流程已到了break的跳轉目的地。
switch要求使用一個integral-selector,並且必須是int或char那樣的整數值。例如,若將一個字元串或者浮點數作為選擇因為使用,那麼它們在switch語句里是不會工作的。對於非整數類型,則必須使用一系列if語句。
public class MyTest01 { public static void main(String[] args){ // switch練習 Random rand = new Random(47); for(int i = 0; i < 10; i++){ int c = rand.nextInt(26) + 'a'; System.out.print((char)c + ", " + c + ": "); switch (c){ case 'a': case 'e': case 'i': case 'o': case 'u': System.out.println("vowel");break; case 'y': case 'w': System.out.println("Sometimes a vowel");break; default: System.out.println("consonant"); } } } } // Output: y, 121: Sometimes a vowel n, 110: consonant z, 122: consonant b, 98: consonant r, 114: consonant n, 110: consonant y, 121: Sometimes a vowel g, 103: consonant c, 99: consonant f, 102: consonant