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指用分號結尾的簡單語句 或複合語句—封閉在花括弧內的一組簡單語句。

迭代

whiledo-whilefor用來控制循環,稱為迭代語句。語句會重複執行,直到起控制作用的布爾表達式得到假的結果為止。

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