स्विच स्टेटमेंट पर भाषाएं स्पष्ट गिरावट का उपयोग क्यों नहीं करती हैं?


17

मैं पढ़ रहा था कि हमें इसमें उपयोग क्यों करना breakहै switch? , और इसने मुझे आश्चर्यचकित किया कि क्यों कुछ भाषाओं (जैसे PHP और जावास्क्रिप्ट) में निहित फ़ॉल-थ्रू की अनुमति है, जबकि स्पष्ट गिरावट के लिए कोई समर्थन (AFAIK) नहीं है।

यह ऐसा नहीं है कि एक नए कीवर्ड को बनाने की आवश्यकता होगी, जैसा continueकि पूरी तरह से उचित होगा, और किसी भी मामले को लेखक के माध्यम से गिराने के लिए अस्पष्टता के किसी भी मुद्दे को हल करेगा।

वर्तमान में समर्थित फ़ॉर्म है:

switch (s) {
    case 1:
        ...
        break;
    case 2:
        ... //ambiguous, was break forgotten?
    case 3:
        ...
        break;
    default:
        ...
        break;
}

जबकि इसे लिखने के लिए समझ में आता है:

switch (s) {
    case 1:
        ...
        break;
    case 2:
        ...
        continue; //unambiguous, the author was explicit
    case 3:
        ...
        break;
    default:
        ...
        break;
}

इस सवाल के प्रयोजनों के लिए इस मुद्दे को अनदेखा करने देता है कि क्या गिरना थ्रू एक अच्छी कोडिंग शैली है या नहीं।

क्या ऐसी कोई भाषा है जो मौजूद है जो गिरने की अनुमति देती है और इसे स्पष्ट किया है?

क्या ऐसे कोई ऐतिहासिक कारण हैं जो switchस्पष्ट के बजाय निहित गिरावट के लिए अनुमति देते हैं?


4
C # के लिए आवश्यक है कि आप स्पष्ट हों goto case, इसलिए आपके प्रश्न का आधार थोड़ा गलत है।
पीडीआर

1
@pdr, मैंने बहुत स्पष्ट रूप से पूछा कि क्या कोई ऐसी भाषा थी जो पहले से ही पतन-दर का समर्थन कर रही थी, मुझे goto caseC # के बारे में जानकारी नहीं थी ।
zzzzBov

हाँ, क्षमा करें, मुझे याद आया कि आपके प्रश्न के दो भाग थे। दुर्भाग्य से, जैसा कि यह है, मैं बहक रहा हूं, मैं मतदान कर रहा हूं क्योंकि यह एक मतदान प्रश्न के बहुत करीब है। बहुत सारे सही उत्तर होंगे।
पीडीआर

C # आपको कई लेबल लगाने की भी अनुमति देता है जो एक ही स्टेटमेंट लिस्ट को साझा करते हैं, जो कुछ ऐसी स्थितियों को दूर करता है जिनके लिए फॉल-थ्रू की आवश्यकता होती है। बाकी के लिए, यह goto caseपीडीआर उल्लेख के रूप में है।
ब्रायन

जवाबों:


20

यह मुख्य रूप से ऐतिहासिक है, ज्यादातर भाषाओं ने सिर्फ सी की नकल की।

सी का कारण यह था कि इस तरह से सी के रचनाकारों को एक छलांग तालिका में अनुकूलित करने के लिए आसान होने के लिए स्विच बयानों का इरादा है। यह भी कारण है कि C सीमाएँ अभिन्न मानों पर स्विच करती हैं।

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


7
एक छोटी सी बात के रूप में, उनकी पुस्तक "एक्सपर्ट सी प्रोग्रामिंग" में, पीटर वैन डेर लिंडेन ने उल्लेख किया है कि जब वह अपने सी कंपाइलर पर सूर्य के लिए काम कर रहे थे, तो कुछ ~ 97% स्विच केस समाहित थे breakऔर केवल 3% से भी कम गिरावट आई थी। । फिर उन्होंने इसे एक उदाहरण के रूप में उपयोग किया कि डिफ़ॉल्ट फ़ॉल-थ्रू व्यवहार काउंटर-सहज है और रिवर्स होने से बेहतर होगा (स्पष्ट फ़ॉल-थ्रू इंगित करने के लिए एक कीवर्ड का उपयोग करें)। ओह, और पुस्तक वास्तव में सी की अन्य विषमताओं को समझाने में बहुत बढ़िया है, जिनमें से कुछ सी ++ में पाए जाते हैं और यहां तक ​​कि सी # और जावा में भी! यह सब बी और बीसीपीएल में निहित है। :)
zxcdw

3
ऐसी प्रोग्रामिंग लैंग्वेज हैं, जहां से गुजरना स्पष्ट है, जैसे c # ( msdn.microsoft.com/en-us/library/06tc147t(v=vs.71).aspx )। दूसरी ओर, ब्रेकिंग c # में भी स्पष्ट है।
लिंकरो

@zxcdw: बहुत बुरा है, कोई तरीका नहीं है कि थोड़ी सी बिरदी समय में वापस जा सके और सुझाव दे कि किसी भी लेबल को चिह्नित किया जाए case, पहले के अलावा, स्वचालित रूप से उपसर्ग किया जाना चाहिए break, लेकिन उन +case(या कुछ अन्य ऐसे डिज़ाइनर) को चिह्नित नहीं किया जाना चाहिए। एक संकलक को संभालना आसान होता और कोड की कई पंक्तियों को समाप्त करते हुए वर्तमान व्यवस्था के शब्दार्थ लाभ की अनुमति देता।
सुपरकैट

7

जाओ fallthroughकीवर्ड का उपयोग करके स्पष्ट गिरावट की अनुमति देता है (ब्रेक अंतर्निहित है, लेकिन स्पष्ट हो सकता है):

switch val {
case 1: // breaks
case 2:
    fallthrough
case 3:
    goto 
case 4, 5, 6: // equivalent to defining individual cases with explicit fallthough
    break // unnecessary
default:
}

यहां प्रभावी गो और भाषा युक्ति से प्रासंगिक बिट है ।

मुझे नहीं लगता कि आप gotoकिसी विशिष्ट मामले में जाने के लिए उपयोग कर सकते हैं , लेकिन आप मामले के अंदर एक लेबल बना सकते हैं और gotoसामान्य की तरह उपयोग कर सकते हैं ।

एक बोनस के रूप में, गो आपको स्टेटमेंट के रूप में एक स्विच में बाइनरी एक्सप्रेशन, स्ट्रिंग्स या प्रकार का उपयोग करने की सुविधा देता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.