2012-08-08 5 views
6

Nachdem ich letzte Nacht etwas von der SCJP-Zertifizierung gelesen hatte, habe ich über Switch-Anweisungen nachgedacht und darüber, wie die Ausdrücke bewertet werden, und ich bin etwas verwirrt über etwas.Warum ist ein boolescher Ausdruck in einem Case-Block gültig, wenn Boolesche Datentypen für Switches nicht unterstützt werden?

Java lassen Sie nicht auf einem boolean schalten, so dass die folgenden nicht kompiliert:

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"); 
      } 
     } 
    } 

jedoch der Compiler wird nicht beschweren, wenn Sie versuchen, einen Ausdruck zu verwenden, um einen Booleschen Wert zurück ein Fall, Block, wie zB:

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"); 
      } 
     } 
    } 

Letztlich kann ich nicht immer in den Fall ('c' | 'd') bekommen, da es vermutlich zu einer boolean bewerten würde ...

Also meine Frage ist:

  1. Warum ist es legal, so etwas wie ('c' | 'd') zu benutzen?
  2. Wie könnte das jemals nützlich sein, da das unerreichbar wäre
  3. Wenn Sie jemals auf mehr als einen Wert, aber ohne Verwendung eines Standardfalls, wollte, ist Ihre einzige Wahl als if-else-Anweisung neu zu implementieren ?
+0

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html # jls-15.22.1 – Mat

+0

Warum wäre es nicht erreichbar? –

+0

Probieren Sie '' c '&' d''was passt' oder 'c' + 'd' das entspricht und 'c'/'d' entspricht dem Nullbyte \ 0;) –

Antwort

12

'c' | 'd' nicht zurück boolean. In diesem Fall ist | bitweise ODER nicht boolesch ODER.

Sie können es in diesem Beispiel sehen, wie es

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

Ausgabe

1100011 
1100100 
======= 
1100111 

und binäre 1.100.111-103 Dezimalzahl berechnet gleich ist, so dass es gültig Fall Argument ist.

4
('c' | 'd') 

ist bit- oder so wird es keinen boolean Wert zurückgeben, es vollständig gültig ist.

Wenn Sie versuchen, die wie folgt aus:

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

es 103 auszudrucken, die den ASCII-Code für g ist.

+1

Ich glaube du meinst _g_, da _C_ ist 67 (103 in oktal) –

+0

Danke für die Korrektur. –

1

Wenn Sie 'c' || 'd' tun, dann erhalten Sie erwartet booleschen Fehler und wird nicht kompilieren.

'c' | 'd' ist bitwise OR

6

'c' | 'd' eine bitweise ist oder die sich ergibt, in 'g', so gilt im Schalter.

Sie können mehr als einen Fall passen zu der if-Anweisung, ohne dabei wie

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