2010-11-22 21 views
30

एक सी switch-case प्रवाह नियंत्रण में करने के बाद, यह एक case के बाद घुंघराले ब्रेसिज़ डाल करने के लिए {} यदि चर कि ब्लॉक में परिभाषित किया जा रहा है की आवश्यकता है।सी स्विच-केस घुंघराले ब्रेसिज़ हर मामले

क्या परिवर्तनीय घोषणा के बावजूद प्रत्येक case के बाद घुंघराले ब्रेसिज़ डालने का बुरा अभ्यास है?

उदाहरण के लिए:

switch(i) { 
    case 1: { 
    int j = 4; 
    ...code... 
    } break; 

    case 2: { //No variable being declared! Brace OK? 
    ...code... 
    } break; 
} 

उत्तर

33

यह निश्चित रूप से हर मामले ब्लॉक में ब्रेसिज़ उपयोग करने के लिए अवैध नहीं है, और यह या तो बुरा शैली जरूरी नहीं है। यदि आपके पास परिवर्तनीय घोषणाओं के कारण ब्रेसिज़ के साथ कुछ केस ब्लॉक हैं, तो दूसरों को ब्रेसिज़ जोड़ने से कोडिंग शैली अधिक सुसंगत हो सकती है।

कहा जा रहा है, यह शायद एक अच्छा विचार नहीं है सीधे सी में मामला ब्लॉक के अंदर चर घोषित करने के लिए है कि अपने संकलक द्वारा अनुमति दी जा सकती है, वहीं शायद एक क्लीनर समाधान है। परस्पर-अनन्य केस ब्लॉक कई सामान्य अस्थायी चर साझा करने में सक्षम हो सकते हैं, या आप पाते हैं कि आपके केस ब्लॉक सहायक कार्यों के रूप में बेहतर काम करेंगे।

+2

बस एक नोट - कोई भी पहले मामले से पहले स्विच की शुरुआत में चर घोषित कर सकता है (और इस प्रकार अधिक घुंघराले ब्रेसिज़ को जोड़ने के बिना इन चर को साझा करें। – martinkunev

8

ब्रेसिज़ रास्ता compilers की वजह से किसी भी गति दंड के बिना हर मामले बयान में इस्तेमाल किया जा सकता है, कोड का अनुकूलन। तो यह सिर्फ शैली और कोडर की वरीयता है।

  • सबसे पसंदीदा उपयोग ब्रेसिज़ का उपयोग नहीं कर रहा है, हालांकि एक सक्रिय विकास के दौरान हर मामले में उनमें से उपयोग आसान पाया जा सकता है कि हर अब और फिर कोड पर कुछ अतिरिक्त बनाने के लिए।

  • यह सिर्फ पूर्वोत्तर है; क्योंकि 'केस' कथन को केवल एक ही कमांड की आवश्यकता नहीं होती है, लेकिन कोड के माध्यम से चलती है क्योंकि यह लेबल के रूप में काम करती है। इसलिए ब्लॉक की आवश्यकता नहीं है, और अमान्य नहीं हैं।

  • 'मामले में चर के साथ; चर के लिए संदर्भ बनाने के लिए ब्रेसिज़ का उपयोग केवल इन-केस में किया जाता है, और यह उनका उपयोग करने के लिए बड़ी समझ में आता है। विभिन्न प्लेटफार्मों पर कुछ कंपाइलर्स अलग-अलग व्यवहार दिखाते हैं यदि वे शामिल नहीं हैं।

+0

क्या आपको पता है कि स्पीड पेनल्टी है या स्टाइल पॉइंट्स में केवल नुकसान है? – Ben

+0

कोई गति दंड नहीं है, और यह आपके जैसे संकलित करता है। मैं इसे शामिल करने के लिए जवाब संपादित कर रहा हूं। – SuperDuck

+0

धन्यवाद बतख, दुर्भाग्य से @ बीटीए का समाधान मेरे गलेदार सिर में थोड़ा स्पष्ट है, लेकिन आपकी मदद के लिए +1 है। – Ben

0

मैं विचार यह बुरा शैली प्रत्येक case में ब्रेसिज़ उपयोग करने के लिए। मामले सी में लेबल हैं, goto लेबल के समान। और वर्तमान सी भाषा में, आप नए ब्लॉक पेश किए बिना प्रत्येक case (या कहीं भी आपको पसंद करते हैं) में चर घोषित करने के लिए स्वतंत्र हैं, हालांकि कुछ लोग (स्वयं शामिल) भी खराब शैली पर विचार करते हैं।

+2

लेकिन यदि आप किसी ब्लॉक को सीमित नहीं करते हैं, तो आप किसी भी मामले में घोषित किसी भी चर को अगले में उपलब्ध होंगे। यदि आपके पास कोई बड़ा 'स्विच' है, तो यह कुछ बुरा बग बना सकता है; बेहतर या तो ब्लॉक को सीमित करें, या उन्हें फ़ंक्शन कॉल से थोड़ा अधिक कम करें। – Javier

+0

@ आर और कोई और - आह - तो ब्लॉक में चर परिभाषित करने का वास्तविक अभ्यास खराब हो सकता है? – Ben

+0

@ जेवियर - मेरे कुछ कंपाइलर ब्रेसिज़ के बिना क्रैश; "अगले में उपलब्ध" स्पष्ट रूप से नहीं होता है ... – Ben

5

आम तौर पर यह एक चर के प्रारंभिकरण पर खराब अभ्यास कूदता है, चाहे goto या switch हो। यह तब होता है जब आपके पास प्रति case ब्लॉक नहीं होते हैं।

सी 99 में भी एक मामला है जहां प्रारंभिक पर कूदना अवैध है, अर्थात् परिवर्तनीय लंबाई सरणी। उन्हें सी ++ में गैर-पीओडी के समान "निर्मित" होना चाहिए, बाद में चर के उपयोग के लिए उनका प्रारंभिक आवश्यक है। तो इस मामले में आप ब्लॉक कथन का उपयोग करना चाहिए।

+0

+1 क्यों 'स्विच' में एक var init में बुरा है, विचार के लिए धन्यवाद। – Ben

0

बस एक मामूली बिंदु जोड़ने के लिए कई संपादकों & आईडीई ब्लॉक को ध्वस्त करने और/या ऑटो इंडेंट किए जाने की अनुमति देते हैं और कई आपको मिलान करने वाली ब्रेस पर कूदने की अनुमति देते हैं - मैं व्यक्तिगत रूप से किसी ऐसे व्यक्ति से नहीं जानता जो आपको कूदने की अनुमति देता है मिलान केस स्टेटमेंट को तोड़ दें।

जब डिबगिंग, या फिर से फैक्टरिंग, अन्य लोगों, (या यहां तक ​​कि कुछ महीनों के बाद भी स्वयं), कोड जिसमें जटिल केस स्टेटमेंट शामिल हैं, कोड के दोनों हिस्सों को ध्वस्त करने और मिलान करने वाले मामलों में कूदने की क्षमता अमूल्य है, विशेष रूप से यदि कोड में इंडेंटेशन विविधता है।

ने कहा कि प्लेग जैसे जटिल केस स्टेटमेंट से बचने के लिए लगभग हमेशा अच्छी सलाह है।

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