2017-12-31 164 views
9

यहां switch कथन का एक उदाहरण दिया गया है। मैं मिलता है नहीं क्यों यह इस तरह से काम करता है:स्विच स्टेटमेंट में मैं किसी अन्य मामले के अंदर मामला क्यों रख सकता हूं?

int main(){ 

    int number1 = 100, number2 = 200; 

    switch(number1){ 
     case 100:{ 
      cout << " outer switch number is: " << number1 << endl; 
     case 200:{ // any value other than 100 
       cout << "inner switch number is: " << number2 << endl; 
      } 
      break;    
     } 
     break;  
    } 

    return 0; 
} 
  • प्रिंट उपरोक्त कार्यक्रम: 100 और फिर case 200 के अगले बयान प्रिंट करता है। इसके अलावा यदि दूसरे मामले में 200 के अलावा कोई भी मूल्य उपयोग किया जाता है, तो यह अभी भी निष्पादित हो जाता है। मुझे पता है कि case 100 के बाद break नहीं है। लेकिन मुझे इसके बजाय संकलन-समय त्रुटि क्यों नहीं मिलती है?

  • साफ होने के लिए, क्यों आंतरिक मामले के अंदर किसी अन्य मान भी सफल होगा? जैसे,

    case 70000: 
    
+1

कुछ अतिरिक्त बाधाओं के साथ एक स्विच/केस काफी मूल्य गणना गोटो/लेबल है। – Eljay

+2

'केस 100' और 'केस 200' के बीच कोई' ब्रेक 'कथन नहीं है, इसलिए गिरावट होती है। –

+2

['स्विच' में किसी भी व्यक्ति की तुलना में कहीं अधिक बुरा चीजें हैं] (http://blog.robertelder.org/switch-statements-statement-expressions/)। –

उत्तर

9

लेकिन कारण है कि मैं एक संकलन समय त्रुटि बजाय नहीं मिलता है?

क्योंकि आप कुछ भी गैरकानूनी नहीं किया। एक केस स्टेटमेंट सिर्फ एक लेबल वाला बयान है। स्विच में अभिव्यक्ति का आकलन करने के लिए मूल्यांकन किया जाता है कि कौन सा लेबल कूदना है ("कूदें" और "लेबल" पर ध्यान दें) और फिर वह कथन निष्पादित करना प्रारंभ होता है। ईमानदार होने के लिए, यह छिपाने में सिर्फ एक गोटो है। यह थोड़ा और बाधा है, लेकिन अभी भी एक कूद है।

केवल बाधा है, क्योंकि यह सी ++ है, कि आप इसे से आगे कूद कर एक वस्तु के प्रारंभ को छोड़ नहीं हो सकता है।

यह सुविधा प्रसिद्धि से (सी में यद्यपि) Duff's Device में इस्तेमाल किया गया था।

, और अधिक स्पष्ट है क्यों आंतरिक मामले के अंदर किसी अन्य मान भी सफल होगा?

क्योंकि कूदने के बाद, उन लेबलों से कोई फर्क नहीं पड़ता। वे सिर्फ विशिष्ट बयान चिह्नित करते हैं। कूदने के बाद, निष्पादन सामान्य रूप से बढ़ता है। और सामान्य निष्पादन विशिष्ट बयानों से बचता नहीं है क्योंकि उन्हें लेबल किया जाता है।

+0

धन्यवाद। लेकिन अगर 'केस 0' लिखें, या' केस 100000' 'यह किसी भी मूल्य के लिए काम करता है ?? – Alex24

+2

@ Alex24 - नहीं यह नहीं करता है। '100' के लिए यह बाहरी ब्लॉक को निष्पादित करना शुरू कर देगा। '200' के लिए यह बाहरी ब्लॉक में पहला निर्देश छोड़ देगा, और आंतरिक ब्लॉक में कूद जाएगा। यदि आप '200' से' 10000' बदलते हैं तो यह अभी भी बाहरी ब्लॉक को निष्पादित करना शुरू कर देगा क्योंकि 'संख्या 1'' 100' है। – StoryTeller

+0

मेरा मतलब है कि बाहरी सफल होता है तो जो भी आंतरिक मूल्य मूल्यांकन किया जा रहा है वह सफल होगा? !!! – Alex24

1

आपको कोई संकलन त्रुटि क्यों नहीं दिखाई दे रही है? ऐसा इसलिए है क्योंकि आपने switch अभिव्यक्ति का सही ढंग से उपयोग किया था। लेकिन, हो सकता है कि आप नतीजे न देख सकें। पहले के एक सरल switch अभिव्यक्ति की कोशिश करते हैं:

switch(number1){ 
    case 100: 
     cout<<"the number is 100"<<endl; 
     break; 
    case 200: 
     cout<<"the number is 200"<<endl; 
     break; 
    default: 
     cout<<"the number is neither 100 nor 200"<<endl; 
     break; 
} 

आप अन्य नंबरों का उपयोग करना चाहते हैं, तो आप switch-case ब्लॉक करने के लिए जोड़ सकते हैं। यदि आप ब्रेक का उपयोग नहीं करते हैं जिसका मतलब है कि अगला मामला लक्ष्य है। जब तक आप ब्रेक का उपयोग नहीं करेंगे तब तक कार्यक्रम जारी रहेगा। default कहता है कि उपरोक्त में से कोई भी नहीं होता है, मैं इस भाग को करना चाहता हूं।

के अपने कार्यक्रम में जाना है और क्या चल रहा है दो:

switch(number1){ 
    case 100:{//if the number is 100 it will start from here 
     cout << " outer switch number is: " << number1 << endl; 
     //it will break after the first break expresion 
    case 200:{ // any value other than 100// if the number is 200 it will start from here 
      cout << "inner switch number is: " << number2 << endl; 
     } 
     break; // I meant her is the first break  
    } 
    break;  
} 
0

एक switch बयान if बयान की तरह काम करता है, लेकिन यह यह करने के लिए पसंद किया जाता है जब एक से अधिक 2 या 3 विकल्पों के साथ निपटने।

switchcase बयान में स्थिति का मूल्यांकन करता है।इसलिए जब भी कोई मामला मिलता है तो यह एक शर्त मानता है, इसलिए यह बयान के अंत के संकेत के रूप में एक ब्रेक मिलने तक निष्पादित रहता है। आपके मामले में case 100 शुरू होता है लेकिन एक और मामला अंदर है, जब तक कि 100 के लिए कोई ब्रेक न हो, सबकुछ निष्पादित होने के बाद।

case 100: 
    // do some stuff 
    case 0: 
     // do another stuff 
    case 5779: 
     // do .... 
break; 

अल ऊपर बयान करता है, तो केवल और अगर case 100 सफल होता है निष्पादित किया जाएगा।

सी में याद रखें ++ आप लिख सकते हैं:

void foo(){ 
    cout << "foo" << endl: 
} 

int main(){ 

    b: 
     foo();   

    return 0; 
} 
ऐसा

यह label लेकिन केवल कीवर्ड case साथ। आप बिना switch के बिना या break से पहले label कार्यों के समान काम कर सकते हैं।

संबंधित मुद्दे