Java程式設計思想學習(四)----第四章:控制執行流程
在Java中,涉及的關鍵字包括if-else、while、do-while、for、return、break 以及選擇語句switch。然而,Java並不支援goto語句(該語句引起許多反對意見,但它仍是解決某些特殊問題的最便利的方法)。在Java中,仍然可以進行類似goto那樣的跳轉,但比起典型的goto,有了很多限制。
4.1 true和false
所有條件語句都利用條件表示式的真或假來決定執行路徑。
4.2 if-else
//:control/IfElse.java import static net.mindview.util.Print.*; public classIfElse{ static int result = 0; static void test(int testval, int target){ if (testval > target) result = +1; else if (testval < target) result = -1; else result = 0;//Match } public static void main(String[] args){ test(10, 5); print(result); test(5, 10); print(result); test(5, 5); print(result); } }/*Output 1 -1 0 *///:~
4.3 迭代
while、do-while和for用來控制迴圈,有時將它們劃分為迭代語句(iteration statement)。語句會重複執行,直到起控制作用的布林表示式( boolean expression)得到“假”的結果為止。
while(boolean-expression) statement
do statement while(boolean-expression);
while和do-while唯一的區別就是do-while中的語句(statement)至少會執行一次,即便表示式第一次就被計算為false。
4.3.2 for
//:control/ListCharacters.java public class ListCharacters{ public static void main(String[] args) { for (char c = 0; c < 128; c++) if (Character.isLowerCase(c)) System.out.println("value:" + (int) c + " Character:" + c); } }/*Output value:97 Character:a value:98 Character:b value:99 Character:c value:100 Character:d value:101 Character:e value:102 Character:f value:103 Character:g value:104 Character:h value:105 Character:i value:106 Character:j value:107 Character:k value:108 Character:l value:109 Character:m value:110 Character:n value:111 Character:o value:112 Character:p value:113 Character:q value:114 Character:r value:115 Character:s value:116 Character:t value:117 Character:u value:118 Character:v value:119 Character:w value:120 Character:x value:121 Character:y value:122 Character:z *///:~
c的作用域就是for控制的表示式的範圍內。
4.3.3 逗號操作符
逗號用作分隔符時用來分隔函式的不同引數。(如:function(a,b,c))
通過使用逗號操作符,可以在for語句內定義多個變數,但是它們必須具有相同的型別。
//:control/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); } }/*Output i = 1, j = 11 i = 2, j = 4 i = 3, j = 6 i = 4, j = 8 *///:~
4.4 Foreach語法
for(float x : f) {}
這條語句定義了一個float型別的變數x,繼而將每一個float元素賦值給x。
儘管range()使得foreach語法可以適用於更多的場合,並且這樣做似乎可以增加可讀性,但是它的效率會稍許降低。
4.5 return
關鍵詞包括return、break、continue和一種與其他語言中的goto類似的跳轉到標號語句的方式。
如果在返回void的方法中沒有return語句,那麼在該方法的結尾處會有一個隱式的return,因此在方法中並非總是必須要有一個return語句。但是,如果一個方法宣告它將返回void之外的其他東酉,那麼必須確保每一條程式碼路徑都將返回一個值。
4.6 break和continue
在任何迭代語句的主體部分,都可用break和continue控制迴圈的流程。其中,break用於強行退出迴圈,不執行迴圈中剩餘的語句。而continue則停止執行當前的迭代,然後退回迴圈起始處,開始下一次迭代。
無窮迴圈的第二種形式是for(;;)。編譯器將while(true)與for(;;)看作是同一回事。
4.7 臭名昭著的goto
Java沒有goto。然而,Java也能完成一些類似於跳轉的操作,這與break和continue這兩個關鍵詞有關。它們其實不是一個跳轉,而是中斷迭代語句的一種方法。之所以把它們納入goto問題中一起討論,是由於它們使用了相同的機制:標籤。
//:control/LabeledFor.java import static net.mindview.util.Print.*; public class LabeledFor { static void init(String s) { print(s + "初始化了一次"); } static void step(String s) { print(s + " step了一次"); } public static void main(String[] args) { int i = 0; outer: for (init("outer"); true; step("outer")) { inner: for (init("inner"); i < 10; step("inner"), i++) { Print.print("i = " + i); if (i == 2) { print("continue"); continue; } if (i == 3) { print("break"); i++; break; } if (i == 7) { print("continue outer"); i++; continue outer; } if (i == 8) { print("break outer"); break outer; } for (int k = 0; k < 5; k++) { if (k == 3) { print("continue inner"); continue inner; } } } } } }/*Output outer初始化了一次 inner初始化了一次 i = 0 continue inner inner step了一次 i = 1 continue inner inner step了一次 i = 2 continue inner step了一次 i = 3 break outer step了一次 inner初始化了一次 i = 4 continue inner inner step了一次 i = 5 continue inner inner step了一次 i = 6 continue inner inner step了一次 i = 7 continue outer outer step了一次 inner初始化了一次 i = 8 break outer *///:~可以得知continue之後會執行step,break不會
如果想在中斷迴圈的同時退出,簡單地用一個return即可。return會結束整個方法,break label跳出迴圈後迴圈後面的程式碼還會依次執行。
4.8 switch
switch(integral-selector) { case integral-value1 : statement; break; case integral-value2 : statement; break; case integral-value3 : statement; break; //... default: statement; }
由於Random.nextInt(26)會產生0到26之間的一個值,所以在其上加上一個偏移量“a”,即可產生小寫字母。
int c = rand.nextInt(26) + 'a' ;
Random.nextInt()將產生0~25之間的一個隨機int值,它將被加到“a”上。這表示“a”將自動被轉換為int以執行加法。
練習9:(4)一個斐波那契數列是由數字
1、1、2、3、5、8、13、21、34等等組成的,其中每一個數字(從第三個數字起)都是前兩個數字的和。建立一個方法,接受一個整數引數,並顯示從第一個元素開始總共由該引數指定的個數所構成的所有斐波那契數字。例如,如果執行java
Fibonacci 5(其中Ffbonaccl是類名),那麼輸出就應該是 1、1、2、3、5。
練習10:(5)吸血鬼數字是指位數為偶數的數字,可以由一對數字相乘而得到,而這對數字各包含乘積的一半位數的數字,其中從最初的數字中選取的數字可以任意排序。以兩個0結尾的數字是不允許的,例如,下列數字都是“吸血鬼”數字:
1260 = 21 * 60 ; 1827 = 21 * 87 ; 2187 = 27 * 81
寫一個程式,找出4位數的所有吸血鬼數字(Dan Forhan推薦)。
@Test public void exercises9() { float f[] = new float[5]; for(int i=0; i< 5; i++) { if(i == 0) { f[i] = 1; }else if(i == 1) { f[i] = 1; }else { f[i] = f[i-1] + f[i-2]; } System.out.println(f[i]); } } @Test public void exercises10() { Integer x = 1111; System.out.println(x.toString().length()); for(int i = 9; i < 100; i ++) { for(int j = 9; j < 100; j ++) { int product = i * j; if(product%100 != 0 && String.valueOf(product).length() == 4) { System.out.println(product + " = " + i + "*" + j); } } } }