में अनुपस्थित यह मान्य, समान संरचना इतना ही नहीं किया गया है है वास्तविक कोड, जैसे, Duff's Device है, जो एक बफर कॉपी करने के लिए एक unrolled पाश है में इस्तेमाल किया:
send(to, from, count)
register short *to, *from;
register count;
{
register n = (count + 7)/8;
switch(count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while(--n > 0);
}
}
के बाद से एक switch
बयान वास्तव में सिर्फ एक पते की गणना करता है और इसे करने के लिए कूदता है, यह देखने के लिए क्यों यह दूसरे के साथ ओवरलैप कर सकते हैं आसान है नियंत्रण संरचनाएं; अन्य नियंत्रण संरचनाओं के भीतर की रेखाओं में ऐसे पते हैं जो कूद लक्ष्य भी हो सकते हैं!
आपके द्वारा प्रस्तुत किए गए मामले में, कल्पना करें कि क्या आपके कोड में switch
या break
एस नहीं है। जब आप if
कथन के then
भाग को निष्पादित करना समाप्त कर लेते हैं, तो आप बस चलते रहेंगे, इसलिए आप case 2:
में आ जाएंगे। अब, चूंकि आपके पास switch
और break
है, यह महत्वपूर्ण है कि break
क्या टूट सकता है। MSDN page, “The C break statement” के अनुसार,
तोड़ बयान enclosing निकटतम के लिए, कर के निष्पादन, स्विच, या जबकि बयान है जिसमें ऐसा लगता है समाप्त हो जाता है। नियंत्रण उस कथन को पास करता है जो समाप्त कथन का पालन करता है।
के बाद से निकटतम करते हैं, के लिए enclosing, स्विच, या जबकि बयान अपने स्विच (सूचना है कि अगर उस सूची में शामिल नहीं है), तो अगर आप 'है then
ब्लॉक के अंदर फिर से, आप switch
कथन के बाहर स्थानांतरित कर सकते हैं। थोड़ा और दिलचस्प क्या है, हालांकि, अगर आप case 0
दर्ज करते हैं तो क्या होता है, लेकिन c == 'A'
गलत है। फिर if
then
ब्लॉक की समाप्ति ब्रेस के ठीक बाद नियंत्रण स्थानांतरित करता है, और आप case 2
में कोड निष्पादित करना प्रारंभ करते हैं।
ठीक है, यह 'स्विच-केस' के अजीब 'गोटो लेबल 'कार्यान्वयन के कारण है। जबकि आपका विशेष मामला शायद थोड़ा अजीब और उपयोग के मामले में आने के लिए मुश्किल है (हालांकि [* डफ की डिवाइस *] (http://en.wikipedia.org/wiki/Duff%27s_device) देखें, हालांकि, गिरावट के मामलों की सामान्य अवधारणा (जब आप 'ब्रेक' छोड़ देते हैं) वास्तव में काफी उपयोगी हो सकते हैं। –
यदि आप अब * डफ के डिवाइस * कैसे काम करते हैं, इस बारे में स्पष्टीकरण चाहते हैं, [यहां] (http://stackoverflow.com/questions/514118/how-does-duffs-device-work) कुछ हैं। – devnull
इस मामले में 'केस 1:' का संकलन एक अलग लेबल के रूप में किया जा रहा है। वाक्यविन्यास पूरी तरह से मान्य है, लेकिन लगभग निश्चित रूप से (संदर्भ से) इस स्थिति में एक तर्क त्रुटि है। इसे 'state == 1' भेजकर परीक्षण करें और आपको गलत परिणाम दिखाई देगा। – Chad