2012-08-08 12 views
6

Sau khi đọc một số chứng nhận SCJP tối qua, tôi đã suy nghĩ về các câu lệnh chuyển đổi và cách các biểu thức được đánh giá, và tôi hơi bối rối bởi một điều gì đó.Tại sao biểu thức boolean hợp lệ trong khối chữ hoa, khi boolean không được hỗ trợ kiểu dữ liệu cho các công tắc?

Java sẽ không cho phép bạn bật một boolean, vì vậy sau đây sẽ không biên dịch:

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

Tuy nhiên, trình biên dịch sẽ không phàn nàn nếu bạn cố gắng sử dụng một biểu thức để đánh giá một giá trị boolean trong một khối trường hợp, chẳng hạn như:

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

Cuối cùng, tôi không thể bao giờ nhận được vào các trường hợp ('c' | 'd') vì nó có lẽ sẽ đánh giá để một boolean ...

Vì vậy, câu hỏi của tôi là:

  1. Tại sao nó hợp pháp để sử dụng một cái gì đó như ('c' | 'd')?
  2. Làm cách nào có thể hữu ích, vì điều đó sẽ không thể truy cập được
  3. Nếu bạn muốn trường hợp nhiều hơn một giá trị, nhưng không sử dụng mặc định, là lựa chọn duy nhất của bạn để triển khai lại dưới dạng tuyên bố if-else ?
+0

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

+0

Tại sao nó không thể truy cập được? –

+0

Thử ''c' & 'd'' khớp với' hoặc' c '+' d 'khớp với Ç và' c '/' d 'khớp với byte nul \ 0;) –

Trả lời

12

'c' | 'd' sẽ không trả lại giá trị boolean. Trong trường hợp này, | là bitwise HOẶC không phải là boolean HOẶC.

Bạn có thể nhìn thấy nó trong ví dụ này nó như thế nào được tính

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

Output

1100011 
1100100 
======= 
1100111 

và nhị phân 1.100.111 tương đương với 103 số nguyên thập phân nên nó là hợp lệ lập luận hợp cụ thể.

4
('c' | 'd') 

Bitwise hoặc vì vậy nó sẽ không quay trở lại một boolean giá trị , nó là hoàn toàn hợp lệ.

Nếu bạn cố gắng mà ra như thế này:

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

nó sẽ in ra 103 là mã ASCII cho g.

+1

Tôi tin rằng bạn có nghĩa là _g_, khi thấy _C_ là 67 (103 trong bát phân) –

+0

Cảm ơn bạn đã sửa. –

1

Nếu bạn làm 'c' || 'd' thì bạn sẽ nhận được lỗi boolean dự kiến ​​và sẽ không biên dịch.

'c' | 'd'bitwise OR

6

'c' | 'd' là một Bitwise hay mà kết quả trong 'g', vì vậy giá trị trong việc chuyển đổi.

Bạn có thể kết hợp nhiều hơn một trường hợp mà không đi đến if-tuyên bố như

switch(theChar) { 
    case 'a': 
     break; 
    case 'b': 
     break; 
    case 'c': 
    case 'd': 
     System.out.println("c or d"); 
     break; 
    default: 
     throw new IllegalStateException(); 
} 
Các vấn đề liên quan