2012-08-08 16 views
6

कल रात कुछ एससीजेपी प्रमाणीकरण पढ़ने के बाद, मुझे स्विच स्टेटमेंट्स और अभिव्यक्तियों का मूल्यांकन कैसे किया जाता है, और मैं कुछ चीज़ों से थोड़ा परेशान हूं।एक बूलियन अभिव्यक्ति एक केस ब्लॉक में मान्य क्यों है, जब बूलियन स्विच के लिए डेटा प्रकार समर्थित नहीं हैं?

जावा आप एक बूलियन पर स्विच करने देगा नहीं है, तो निम्नलिखित संकलन नहीं होगा:

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. होगा यदि आप कभी भी एक से अधिक मूल्य पर केस करना चाहता था, लेकिन एक डिफ़ॉल्ट का उपयोग किए बिना, एक अगर-किसी और बयान के रूप में करने के लिए फिर से लागू अपने ही विकल्प है ?
+0

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html अगर बयान पर जाए बिना एक से अधिक मामले मिलान कर सकते हैं # जेएलएस -15.22.1 – Mat

+0

यह पहुंच योग्य क्यों होगा? –

+0

'सी' और 'डी' का प्रयास करें जो 'या' सी '+' डी 'से मेल खाता है जो Ç और' c '/' d 'से मेल खाता है nul byte \ 0;) –

उत्तर

12

'c' | 'd' वापस बूलियन नहीं होगा। इस मामले में | बिटवाई है या बूलियन नहीं है।

आप इस उदाहरण में देख सकते हैं यह गणना कैसे की जाती

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 

और बाइनरी 1,100,111 103 दशमलव पूर्णांक के बराबर है तो यह वैध मामले तर्क है।

4
('c' | 'd') 

, बिटवाइज़ या है, इसलिए यह एक बूलियन मूल्य वापस नहीं होगा यह पूरी तरह से वैध है।

आपको लगता है कि बाहर की कोशिश करते हैं इस तरह:

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

यह 103 जो जी के लिए ASCII कोड है बाहर प्रिंट होगा।

+1

मेरा मानना ​​है कि आप _g_ का मतलब है, _C_ 67 (ऑक्टल में 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(); 
} 
संबंधित मुद्दे