2012-01-06 6 views
6

आम तौर पर जब एक switch कथन का उपयोग, आप को परिभाषित नहीं कर सकते हैं और यौगिक बयान के स्थानीय चर को प्रारंभ,क्या यौगिक स्विच कथन में स्थानीय चर प्रारंभ होते हैं जब 'डिफ़ॉल्ट:' लेबल ब्रेसिज़ के बाहर रखा जाता है?

switch (a) 
{ 
    int b = 5; /* Initialization is skipped, no matter what a is */ 

    case 1: 
    /* Do something */ 
    break; 
    default: 
    /* Do something */ 
    break; 
} 

हालांकि तरह, के बाद से switch बयान for या while की तरह एक बयान है, वहाँ के खिलाफ कोई नियम नहीं है एक कंपाउंड स्टेटमेंट का उपयोग नहीं करते, look here for examples। लेकिन इसका मतलब यह होगा कि switch कीवर्ड और उद्घाटन ब्रेस के बाद समापन कोष्ठक के बीच एक लेबल का उपयोग किया जा सकता है।

तो मेरी राय में, यह संभव हो सकता है और एक switch बयान इस तरह उपयोग करने की अनुमति होगी:

switch (a) 
    default: 
{ 
    int b = 5; /* Is the initialization skipped when a != 1? */ 
    /* Do something for the default case using 'b' */ 
    break; 

    case 1: // if a == 1, then the initialization of b is skipped. 
    /* Do something */ 
    break; 
} 

मेरा प्रश्न: प्रारंभ जरूरी इस मामले में किया जाता है (एक = 1!)? मानकों के बारे में मुझे क्या पता है, हां, यह होना चाहिए, लेकिन मैं इसे उपलब्ध दस्तावेजों में सीधे नहीं ढूंढ सकता। क्या कोई एक निर्णायक उत्तर प्रदान कर सकता है?

और इससे पहले कि मैं उस प्रभाव पर टिप्पणी प्राप्त करूं, हाँ, मुझे पता है कि यह वास्तविक दुनिया में प्रोग्राम करने का एक तरीका नहीं है। लेकिन, हमेशा के रूप में, मुझे भाषा विनिर्देश की सीमाओं में दिलचस्पी है। मैं में प्रोग्रामिंग टीम में ऐसी शैली कभी बर्दाश्त नहीं करता!

+0

@ मैट नहीं, यह सिर्फ विचार है: कथन के अंत तक (आमतौर पर परिसर) तक समापन कोष्ठक के बाद 'स्विच' कथन में लेबल दिखाई दे सकते हैं, इसलिए 'डिफ़ॉल्ट:' ब्रेसिज़ के बाहर लेबल कानूनी IMHO होगा । उलझन में, हाँ, निश्चित रूप से! लेकिन कोई लापता ब्रेसिज़ नहीं है। –

+1

तो क्या आप पूछ रहे हैं कि 'बी' वैध है या नहीं, यदि मामला 1' लिया गया है? यह वास्तव में 'goto foo के लिए अलग नहीं है; {int बी = 5; foo: ...} '। –

+0

ठीक है, ठीक है कि यह निश्चित रूप से भ्रमित है ... – Mat

उत्तर

7

अधिकांश लोग एक मल्टीपल के रूप में switch के बारे में सोचते हैं, लेकिन यह तकनीकी रूप से गणना की जाती है goto। और case <cte>: और default: वास्तव में लेबल हैं। तो इन मामलों में goto के नियम लागू होते हैं।

आपके दोनों उदाहरण वाक्य रचनात्मक रूप से कानूनी हैं, लेकिन दूसरे में, जब a==1b प्रारंभिकता छोड़ी जाएगी और इसका मूल्य अपरिभाषित होगा। जब तक आप इसका उपयोग नहीं करते हैं तब तक कोई समस्या नहीं है।

संदर्भ:

C99 मानक, 6.2.4.5, स्वत: चर के बारे में के अनुसार:

एक प्रारंभ विशिष्ट वस्तु के लिए एड, हर बार घोषणा में पहुँच जाता है किया जाता है है, तो ब्लॉक का निष्पादन;

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

+0

लेकिन 'ए! = 1'' शुरू होने की गारंटी है? आपके पहले उदाहरण में –

+0

_No_; _yes_ आपके दूसरे में। कृपया, अद्यतन उत्तर में मानक के संदर्भ देखें। – rodrigo

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

  • कोई संबंधित समस्या नहीं^_^