程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java的switch語句

java的switch語句

編輯:關於JAVA

“開關”(Switch)有時也被劃分為一種“選擇語句”。根據一個整數表達式的值,switch語句可從一系列代碼選出一段執行。它的格式如下:

switch(整數選擇因子) {
case 整數值1 : 語句; break;
case 整數值2 : 語句; break;
case 整數值3 : 語句; break;
case 整數值4 : 語句; break;
case 整數值5 : 語句; break;
//..
default:語句;
}

其中,“整數選擇因子”是一個特殊的表達式,能產生整數值。switch能將整數選擇因子的結果與每個整數值比較。若發現相符的,就執行對應的語句(簡單或復合語句)。若沒有發現相符的,就執行default語句。
在上面的定義中,大家會注意到每個case均以一個break結尾。這樣可使執行流程跳轉至switch主體的末尾。這是構建switch語句的一種傳統方式,但break是可選的。若省略break,會繼續執行後面的case語句的代碼,直到遇到一個break為止。盡管通常不想出現這種情況,但對有經驗的程序員來說,也許能夠善加利用。注意最後的default語句沒有break,因為執行流程已到了break的跳轉目的地。當然,如果考慮到編程風格方面的原因,完全可以在default語句的末尾放置一個break,盡管它並沒有任何實際的用處。
switch語句是實現多路選擇的一種易行方式(比如從一系列執行路徑中挑選一個)。但它要求使用一個選擇因子,並且必須是int或char那樣的整數值。例如,假若將一個字串或者浮點數作為選擇因子使用,那麼它們在switch語句裡是不會工作的。對於非整數類型,則必須使用一系列if語句。
下面這個例子可隨機生成字母,並判斷它們是元音還是輔音字母:
 

//: VowelsAndConsonants.java
// Demonstrates the switch statement

public class VowelsAndConsonants {
  public static void main(String[] args) {
    for(int i = 0; i < 100; i++) {
      char c = (char)(Math.random() * 26 + 'a');
      System.out.print(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");
      }
    }
  }
} ///:~


由於Math.random()會產生0到1之間的一個值,所以只需將其乘以想獲得的最大隨機數(對於英語字母,這個數字是26),再加上一個偏移量,得到最小的隨機數。
盡管我們在這兒表面上要處理的是字符,但switch語句實際使用的字符的整數值。在case語句中,用單引號封閉起來的字符也會產生整數值,以便我們進行比較。
請注意case語句相互間是如何聚合在一起的,它們依次排列,為一部分特定的代碼提供了多種匹配模式。也應注意將break語句置於一個特定case的末尾,否則控制流程會簡單地下移,並繼續判斷下一個條件是否相符。

1. 具體的計算
應特別留意下面這個語句:
char c = (char)(Math.random() * 26 + 'a');
Math.random()會產生一個double值,所以26會轉換成double類型,以便執行乘法運算。這個運算也會產生一個double值。這意味著為了執行加法,必須無將'a'轉換成一個double。利用一個“造型”,double結果會轉換回char。
我們的第一個問題是,造型會對char作什麼樣的處理呢?換言之,假設一個值是29.7,我們把它造型成一個char,那麼結果值到底是30還是29呢?答案可從下面這個例子中得到:

 

//: CastingNumbers.java
// What happens when you cast a float or double
// to an integral value?

public class CastingNumbers {
  public static void main(String[] args) {
    double
      above = 0.7,
      below = 0.4;
    System.out.println("above: " + above);
    System.out.println("below: " + below);
    System.out.println(
      "(int)above: " + (int)above);
    System.out.println(
      "(int)below: " + (int)below);
    System.out.println(
      "(char)('a' + above): " +
      (char)('a' + above));
    System.out.println(
      "(char)('a' + below): " +
      (char)('a' + below));
  }
} ///:~


輸出結果如下:

 

above: 0.7
below: 0.4
(int)above: 0
(int)below: 0
(char)('a' + above): a
(char)('a' + below): a


所以答案就是:將一個float或double值造型成整數值後,總是將小數部分“砍掉”,不作任何進位處理。
第二個問題與Math.random()有關。它會產生0和1之間的值,但是否包括值'1'呢?用正統的數學語言表達,它到底是(0,1),[0,1],(0,1],還是[0,1)呢(方括號表示“包括”,圓括號表示“不包括”)?同樣地,一個示范程序向我們揭示了答案:

 

//: RandomBounds.java
// Does Math.random() produce 0.0 and 1.0?

public class RandomBounds {
  static void usage() {
    System.err.println("Usage: \n\t" +
      "RandomBounds lower\n\t" +
      "RandomBounds upper");
    System.exit(1);
  }
  public static void main(String[] args) {
    if(args.length != 1) usage();
    if(args[0].equals("lower")) {
      while(Math.random() != 0.0)
        ; // Keep trying
      System.out.println("Produced 0.0!");
    } 
    else if(args[0].equals("upper")) {
      while(Math.random() != 1.0)
        ; // Keep trying
      System.out.println("Produced 1.0!");
    } 
    else 
      usage();
  }
} ///:~

為運行這個程序,只需在命令行鍵入下述命令即可:
java RandomBounds lower

java RandomBounds upper

在這兩種情況下,我們都必須人工中斷程序,所以會發現Math.random()“似乎”永遠都不會產生0.0或1.0。但這只是一項實驗而已。若想到0和1之間有2的128次方不同的雙精度小數,所以如果全部產生這些數字,花費的時間會遠遠超過一個人的生命。當然,最後的結果是在Math.random()的輸出中包括了0.0。或者用數字語言表達,輸出值范圍是[0,1)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved