2012-08-08 1 views
6

昨晩SCJP認証の一部を読んだ後、私はswitch文とその評価方法について考えていました。私は何かに少し困惑しています。ブーリアンがスイッチのサポートされていないデータ型である場合、ブール式がケースブロックで有効なのはなぜですか?

のJavaを使用すると、ブール値に切り替えることができないので、以下はコンパイルされません:あなたはブール値を評価する式を使用しようとすると、

public static void switchOnBoolean(boolean theBool) 
    { 
     System.out.println("\n\nAssessing boolean :" + theBool); 
     // line below won't compile, since booleans are not valid for the switch statement 
     switch(theBool) 
     { 
      case true: 
      { 
       System.out.println("The boolean was true"); 
       break; 
      } 
      case false: 
      { 
       System.out.println("The boolean was false"); 
      } 
     } 
    } 

しかし、コンパイラは文句を言わないだろう以下のような場合のブロック、:

public static void switchOnChar(char theChar) 
    { 
     System.out.println("\n\nAssessing char : " + theChar); 
     switch(theChar) 
     { 
      case 'a': 
      { 
       System.out.println("The char was a"); 
       break; 
      } 
      case 'b': 
      { 
       System.out.println("The char was b"); 
       break; 
      } 
      case ('c' | 'd'): 
      { 
       System.out.println("The char was c or d"); 
       break; 
      } 
      default: 
      { 
       System.out.println("The char didn't match anything, must be something else"); 
      } 
     } 
    } 

それはおそらくブールに評価しますので、最終的には、私が今までケース('c' | 'd')に入ることができない...

だから私の質問は次のとおりです。

  1. なぜそれが('c' | 'd')のようなものを使用するのは合法ですか?
  2. これは到達できないので、これまでどんなに役に立つのでしょうか
  3. デフォルト値を使用せずに複数の値を大文字にしたい場合は、if-else文として再実装する唯一の選択肢です?
+0

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.htmlのようにif文に行かなくても、複数のケースを一致させることができます#jls-15.22.1 – Mat

+0

なぜ届かないのですか? –

+0

「c」と「d」が一致する「c」と「d」と一致する「c」と「d」を試してください。 –

答えて

12

'c' | 'd'戻り値はブール値です。この場合、|はビット単位ORです。ブール値ORではありません。

あなたは、有効場合の引数であるので

System.out.println(Integer.toBinaryString('c')); 
System.out.println(Integer.toBinaryString('d')); 
System.out.println("======="); 
System.out.println(Integer.toBinaryString('c' | 'd')); 

出力

1100011 
1100100 
======= 
1100111 

とバイナリ1100111 103 10進の整数に等しい計算する方法この例ではそれを見ることができます。

4
('c' | 'd') 

は、それが完全に有効であるので、それはブール値を返しませんビット単位またはです。

あなたはこのようにそれを試してみる場合:

System.out.println('c' | 'd'); 

それはグラムのASCIIコードである103を出力します。

+1

私はあなたが_g_を意味していると信じています。_C_は67(8進数で103)です。 –

+0

ありがとうございました。 –

1

'c' || 'd'を実行すると、予想されるブールエラーが発生し、コンパイルされません。

'c' | 'd'bitwise OR

6

'c' | 'd'がビット単位又はそのスイッチでそう有効、'g'もたらすです。

あなたは

switch(theChar) { 
    case 'a': 
     break; 
    case 'b': 
     break; 
    case 'c': 
    case 'd': 
     System.out.println("c or d"); 
     break; 
    default: 
     throw new IllegalStateException(); 
} 
関連する問題