कथन बदलें (स्विच स्टेटमेंट): Difference between revisions

From Vigyanwiki
(Re-edited)
No edit summary
Line 1: Line 1:
{{short description|Type of selection control mechanism in computer programming languages}}
{{short description|Type of selection control mechanism in computer programming languages}}
[[कंप्यूटर प्रोग्रामिंग भाषा|कंप्यूटर programming languages]]  में, '''स्विच स्टेटमेंट''' एक प्रकार का सलेक्शन कण्ट्रोल मैकेनिज्म है जिसका उपयोग सर्च और मैप के माध्यम से प्रोग्राम निष्पादन के कण्ट्रोल फ्लो को परिवर्तित करने के लिए किसी [[चर (प्रोग्रामिंग)|वेरिएबल]] या अभिव्यंजन के मान को अनुमति देने के लिए किया जाता है।
[[कंप्यूटर प्रोग्रामिंग भाषा|कंप्यूटर प्रोग्रामिंग लैंगुएजेस]]  में, '''स्विच स्टेटमेंट''' एक प्रकार का सलेक्शन कण्ट्रोल मैकेनिज्म है जिसका उपयोग सर्च और मैप के माध्यम से प्रोग्राम निष्पादन के कण्ट्रोल फ्लो को परिवर्तित करने के लिए किसी [[चर (प्रोग्रामिंग)|वेरिएबल]] या अभिव्यंजन के मान को अनुमति देने के लिए किया जाता है।


स्विच स्टेटमेंट कुछ कुछ [[सी (प्रोग्रामिंग भाषा)|C/]][[सी++|C++]], C#, विज़ुअल बेसिक .NET, [[जावा (प्रोग्रामिंग भाषा)|Java]] जैसी programming languages में उपयोग किए जाने वाले <code>if</code> स्टेटमेंट के समान कार्य करते हैं और अधिकांश उच्च स्तरीय [[अनिवार्य प्रोग्रामिंग|अत्यावश्यक]] programming languages जैसे [[पास्कल (प्रोग्रामिंग भाषा)|Pascal]], [[एडा (प्रोग्रामिंग भाषा)|Ada]], C/C++, C#,<ref name="Bloch">{{cite book | title= "Effective Java: Programming Language Guide" |last=Bloch| first=Joshua| publisher=Addison-Wesley | edition=third | isbn=978-0134685991| year=2018}}</ref>{{rp|157-167}}  विज़ुअल बेसिक .NET, Java,<ref name="Bloch2">{{Cite book|last=Bloch|first=Joshua|title="Effective Java: Programming Language Guide"|publisher=Addison-Wesley|year=2018|isbn=978-0134685991|edition=third}}</ref> {{Rp|157-167}} और कई अन्य प्रकार की language में विद्यमान हैं, जिनमें <code>switch</code>, <code>case</code>, <code>select</code> या <code>inspect</code>जैसे [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)|कीवर्ड]] का उपयोग किया जाता है।
स्विच स्टेटमेंट कुछ कुछ [[सी (प्रोग्रामिंग भाषा)|C/]][[सी++|C++]], C#, विज़ुअल बेसिक .NET, [[जावा (प्रोग्रामिंग भाषा)|Java]] जैसी प्रोग्रामिंग लैंगुएजेस में उपयोग किए जाने वाले <code>if</code> स्टेटमेंट के समान कार्य करते हैं और अधिकांश उच्च स्तरीय [[अनिवार्य प्रोग्रामिंग|अत्यावश्यक]] प्रोग्रामिंग लैंगुएजेस जैसे [[पास्कल (प्रोग्रामिंग भाषा)|Pascal]], [[एडा (प्रोग्रामिंग भाषा)|Ada]], C/C++, C#,<ref name="Bloch">{{cite book | title= "Effective Java: Programming Language Guide" |last=Bloch| first=Joshua| publisher=Addison-Wesley | edition=third | isbn=978-0134685991| year=2018}}</ref>{{rp|157-167}}  विज़ुअल बेसिक .NET, Java,<ref name="Bloch2">{{Cite book|last=Bloch|first=Joshua|title="Effective Java: Programming Language Guide"|publisher=Addison-Wesley|year=2018|isbn=978-0134685991|edition=third}}</ref> {{Rp|157-167}} और कई अन्य प्रकार की लैंगुएज में विद्यमान हैं, जिनमें <code>switch</code>, <code>case</code>, <code>select</code> या <code>inspect</code>जैसे [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)|कीवर्ड]] का उपयोग किया जाता है।


स्विच स्टेटमेंट दो मुख्य प्रकार के होते हैं: पास्कल जैसे स्ट्रक्चर्ड स्विच जो यथार्थतः एक ब्रांच प्राप्त करता है, और C जैसे अनस्ट्रक्चर्ड स्विच जो एक तरह के [[ के लिए जाओ |गोटू]] के रूप में काम करता है। स्विच का उपयोग करने के मुख्य कारण में से एक यह है कि यह स्पष्टता को उत्कृष्ट बनाने में सहायता करता है, क्योंकि इससे पुनरावृत्तीय कोडिंग को कम किया जा सकता है, और (यदि ह्यूरिस्टिक्स अनुमति प्रदान करती है) बहुत से स्थितियों में सहज कंपाइलर अनुकूलन के माध्यम से तेज निष्पादन की संभावना भी प्रदान करता है।
स्विच स्टेटमेंट दो मुख्य प्रकार के होते हैं: पास्कल जैसे स्ट्रक्चर्ड स्विच जो यथार्थतः एक ब्रांच प्राप्त करता है, और C जैसे अनस्ट्रक्चर्ड स्विच जो एक तरह के [[ के लिए जाओ |गोटू]] के रूप में काम करता है। स्विच का उपयोग करने के मुख्य कारण में से एक यह है कि यह स्पष्टता को उत्कृष्ट बनाने में सहायता करता है, क्योंकि इससे पुनरावृत्तीय कोडिंग को कम किया जा सकता है, और (यदि ह्यूरिस्टिक्स अनुमति प्रदान करती है) बहुत से स्थितियों में सहज कंपाइलर अनुकूलन के माध्यम से तेज निष्पादन की संभावना भी प्रदान करता है।
Line 36: Line 36:
== विशिष्ट सिंटेक्स ==
== विशिष्ट सिंटेक्स ==


अधिकांश languages में, प्रोग्रामर एक या दो कीवर्ड का उपयोग करके कई एकाकी लाइनों में स्विच स्टेटमेंट लिखते हैं। एक सामान्य सिंटेक्स में सम्मिलित हैं:
अधिकांश लैंगुएजेस में, प्रोग्रामर एक या दो कीवर्ड का उपयोग करके कई एकाकी लाइनों में स्विच स्टेटमेंट लिखते हैं। एक सामान्य सिंटेक्स में सम्मिलित हैं:


* सर्वप्रथम <code>select</code>, उसके बाद एक एक्सप्रेशन जिसे प्रायः स्विच स्टेटमेंट की ''कण्ट्रोल एक्सप्रेशन'' या ''कण्ट्रोल वेरिएबल'' के रूप में संदर्भित किया जाता है
* सर्वप्रथम <code>select</code>, उसके बाद एक एक्सप्रेशन जिसे प्रायः स्विच स्टेटमेंट की ''कण्ट्रोल एक्सप्रेशन'' या ''कण्ट्रोल वेरिएबल'' के रूप में संदर्भित किया जाता है
* वास्तविक स्थितियों (मूल्यों) को परिभाषित करने वाली बाद की पंक्तियाँ, मिलान होने पर निष्पादन के लिए बयानों के संगत अनुक्रम के साथ
* वास्तविक स्थितियों (मूल्यों) को परिभाषित करने वाली बाद की पंक्तियाँ, मिलान होने पर निष्पादन के लिए बयानों के संगत अनुक्रम के साथ
* फॉलथ्रू बिहेवियर वाली languages में, <code>break</code> स्टेटमेंट सामान्यतः उक्त स्टेटमेंट को समाप्त करने के लिए <code>case</code> स्टेटमेंट का अनुसरण करता है। [वेल्स]
* फॉलथ्रू बिहेवियर वाली लैंगुएजेस में, <code>break</code> स्टेटमेंट सामान्यतः उक्त स्टेटमेंट को समाप्त करने के लिए <code>case</code> स्टेटमेंट का अनुसरण करता है। [वेल्स]
* कुछ languages में, जैसे, पीएल/आई, कण्ट्रोल एक्सप्रेशन वैकल्पिक है; यदि कोई कण्ट्रोल एक्सप्रेशन नहीं है, तो प्रत्येक विकल्प एक बूलियन एक्सप्रेशन वाले <CODE>WHEN</CODE> क्लॉज से शुरू होता है और पहले स्थिति के लिए एक मिलान होता है जिसके लिए वह एक्सप्रेशन सही मूल्यांकन करती है। यह उपयोग कुछ अन्य languages में if/then/elseif/else संरचनाओं के समान है, उदाहरण के लिए, [[पर्ल]]।
* कुछ लैंगुएजेस में, जैसे, पीएल/आई, कण्ट्रोल एक्सप्रेशन वैकल्पिक है; यदि कोई कण्ट्रोल एक्सप्रेशन नहीं है, तो प्रत्येक विकल्प एक बूलियन एक्सप्रेशन वाले <CODE>WHEN</CODE> क्लॉज से शुरू होता है और पहले स्थिति के लिए एक मिलान होता है जिसके लिए वह एक्सप्रेशन सही मूल्यांकन करती है। यह उपयोग कुछ अन्य लैंगुएजेस में if/then/elseif/else संरचनाओं के समान है, उदाहरण के लिए, [[पर्ल]]।
* कुछ languages में, उदाहरण के लिए, [[Rexx]], किसी भी कण्ट्रोल एक्सप्रेशन की अनुमति नहीं है और प्रत्येक विकल्प एक बूलियन एक्सप्रेशन वाले <CODE>WHEN</CODE> क्लॉज से शुरू होता है और पहले स्थिति के लिए एक मिलान होता है जिसके लिए वह एक्सप्रेशन सत्य का मूल्यांकन करती है।
* कुछ लैंगुएजेस में, उदाहरण के लिए, [[Rexx]], किसी भी कण्ट्रोल एक्सप्रेशन की अनुमति नहीं है और प्रत्येक विकल्प एक बूलियन एक्सप्रेशन वाले <CODE>WHEN</CODE> क्लॉज से शुरू होता है और पहले स्थिति के लिए एक मिलान होता है जिसके लिए वह एक्सप्रेशन सत्य का मूल्यांकन करती है।


प्रत्येक विकल्प विशेष मान, या मानों की सूची (नीचे देखें) से शुरू होता है, जिससे कण्ट्रोल चर मेल खा सकता है और जो कण्ट्रोल को स्टेटमेंट्स के संगत अनुक्रम में ले जाने का कारण बनेगा। मान (या मानों की सूची/श्रेणी) को सामान्यतः संबंधित स्टेटमेंट अनुक्रम से एक कोलन या एक निहितार्थ एरो द्वारा अलग किया जाता है। कई languages में, प्रत्येक केस के पहले कोई कीवर्ड भी होना चाहिए जैसे कि <code>case</code> या <code>when</code>।
प्रत्येक विकल्प विशेष मान, या मानों की सूची (नीचे देखें) से शुरू होता है, जिससे कण्ट्रोल चर मेल खा सकता है और जो कण्ट्रोल को स्टेटमेंट्स के संगत अनुक्रम में ले जाने का कारण बनेगा। मान (या मानों की सूची/श्रेणी) को सामान्यतः संबंधित स्टेटमेंट अनुक्रम से एक कोलन या एक निहितार्थ एरो द्वारा अलग किया जाता है। कई लैंगुएजेस में, प्रत्येक केस के पहले कोई कीवर्ड भी होना चाहिए जैसे कि <code>case</code> या <code>when</code>।


वैकल्पिक डिफ़ॉल्ट स्थिति की भी सामान्यतः अनुमति होती है, जो <code>default</code>, <code>otherwise</code>, या <code>else</code> कीवर्ड द्वारा निर्दिष्ट होता है। यह तब निष्पादित होता है जब कोई अन्य मामला कण्ट्रोल एक्सप्रेशन से मेल नहीं खाता है। कुछ languages में, जैसे कि C, यदि कोई भी स्थिति समतुल्य नहीं होती है और <code>default</code> को छोड़ दिया जाता है तो <code>switch</code> स्टेटमेंट बस समाप्त हो जाता है। अन्य में, जैसे पीएल/आई में, एक त्रुटि उत्पन्न होती है।
वैकल्पिक डिफ़ॉल्ट स्थिति की भी सामान्यतः अनुमति होती है, जो <code>default</code>, <code>otherwise</code>, या <code>else</code> कीवर्ड द्वारा निर्दिष्ट होता है। यह तब निष्पादित होता है जब कोई अन्य मामला कण्ट्रोल एक्सप्रेशन से मेल नहीं खाता है। कुछ लैंगुएजेस में, जैसे कि C, यदि कोई भी स्थिति समतुल्य नहीं होती है और <code>default</code> को छोड़ दिया जाता है तो <code>switch</code> स्टेटमेंट बस समाप्त हो जाता है। अन्य में, जैसे पीएल/आई में, एक त्रुटि उत्पन्न होती है।


== शब्दार्थ ==
== शब्दार्थ ==
Line 58: Line 58:
=== फाल्थ्रू ===
=== फाल्थ्रू ===


कई languages में, केवल समतुल्य ब्लॉक को निष्पादित किया जाता है, और फिर स्विच स्टेटमेंट के अंत में निष्पादन सतत रहता है। इनमें पास्कल वर्ग (ऑब्जेक्ट पास्कल, मोडुला, ओबेरॉन, एडा, आदि) के साथ-साथ पीएल/आई, [[फोरट्रान]] के आधुनिक रूप और पास्कल से प्रभावित [[ बुनियादी |बेसिक]] बोलियाँ, अधिकांश कार्यात्मक languages और कई अन्य सम्मिलित हैं। एक ही कोड को निष्पादित करने के लिए कई मानों की अनुमति देने के लिए (और [[डुप्लिकेट कोड]] करने की आवश्यकता से बचने के लिए), पास्कल-प्रकार की languages प्रति स्थिति में किसी भी संख्या में मानों की अनुमति देती हैं, जो अल्पविराम से अलग की गई सूची के रूप में, एक श्रेणी के रूप में या एक संयोजन के रूप में दी जाती हैं।
कई लैंगुएजेस में, केवल समतुल्य ब्लॉक को निष्पादित किया जाता है, और फिर स्विच स्टेटमेंट के अंत में निष्पादन सतत रहता है। इनमें पास्कल वर्ग (ऑब्जेक्ट पास्कल, मोडुला, ओबेरॉन, एडा, आदि) के साथ-साथ पीएल/आई, [[फोरट्रान]] के आधुनिक रूप और पास्कल से प्रभावित [[ बुनियादी |बेसिक]] बोलियाँ, अधिकांश कार्यात्मक लैंगुएजेस और कई अन्य सम्मिलित हैं। एक ही कोड को निष्पादित करने के लिए कई मानों की अनुमति देने के लिए (और [[डुप्लिकेट कोड]] करने की आवश्यकता से बचने के लिए), पास्कल-प्रकार की लैंगुएजेस प्रति स्थिति में किसी भी संख्या में मानों की अनुमति देती हैं, जो अल्पविराम से अलग की गई सूची के रूप में, एक श्रेणी के रूप में या एक संयोजन के रूप में दी जाती हैं।


C language से प्रगत languages और अधिक सामान्य रूप से फोरट्रान के गणना की गई जीओटीओ से प्रभावित languages, फॉलथ्रू का प्रदर्शन करती हैं। इसमें कण्ट्रोल मिलता है जो मिलाने वाले केस में जाता है, और फिर निष्पादन सोर्स पाठ में ''अगले केस'' के साथ जारी रखता है ("फॉलथ्रू" होता है)। फॉलथ्रू के द्वारा, एक ही बिंदु के साथ कई मान पूर्णतः कोई विशेष विधि के बिना मिल सकते हैं: वे बस एम्प्टी बॉडी के साथ सूचीबद्ध होते हैं। मानों को मामले के शरीर में कोड से विशेष शर्ताधारी किया जा सकता है। व्यावहारिक रूप से, फॉलथ्रू साधारण तौर पर मिलाने वाले शरीर के अंत में एक ब्रेक कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन को बंद कर देता है, लेकिन अगर प्रोग्रामर भूल जाता है तो यह अचानकी फॉलथ्रू के कारण बग्स का कारण बन सकता है। केस बॉडी में कोड के साथ मूल्यों को विशेष रूप से अनुकूलित किया जा सकता है। व्यवहार में, फॉलथ्रू को सामान्यतः मिलान निकाय के अंत में एक <code>break</code> कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन से बाहर निकलता है, लेकिन यदि प्रोग्रामर <code>break</code> स्टेटमेंट डालना भूल जाता है तो यह अनजाने में फॉलथ्रू के कारण बग उत्पन्न कर सकता है। इस प्रकार इसे कई लोगों द्वारा<ref>van der Linden, Peter (1994). ''Expert C Programming: Deep C Secrets'', p. 38. Prentice Hall, Eaglewood Cliffs. {{ISBN|0131774298}}.</ref> language के मस्से के रूप में देखा जाता है, और कुछ लिंट टूल्स में इसके प्रति चेतावनी दी जाती है। वाक्यात्मक रूप से, स्थितियों को लेबल के रूप में समझा जाता है, ब्लॉक के रूप में नहीं, और स्विच और <code>break</code> स्टेटमेंट स्पष्ट रूप से कण्ट्रोल प्रवाह को बदलते हैं। C से प्रभावित कुछ languages, जैसे कि [[जावास्क्रिप्ट|JavaScript]], डिफॉल्ट फॉलथ्रू को बनाए रखती हैं, जबकि अन्य फॉलथ्रू को हटा देती हैं, या केवल विशेष परिस्थितियों में ही इसकी अनुमति देती हैं। सी-वर्ग में इस पर उल्लेखनीय विविधताओं में C# सम्मिलित है, जिसमें सभी ब्लॉकों को <code>break</code> या <code>return</code> के साथ समाप्त किया जाना चाहिए जब तक कि ब्लॉक खाली न हो (अर्थात फॉलथ्रू का उपयोग कई मान निर्दिष्ट करने के तरीके के रूप में किया जाता है)।
C लैंगुएज से प्रगत लैंगुएजेस और अधिक सामान्य रूप से फोरट्रान के गणना की गई जीओटीओ से प्रभावित लैंगुएजेस, फॉलथ्रू का प्रदर्शन करती हैं। इसमें कण्ट्रोल मिलता है जो मिलाने वाले केस में जाता है, और फिर निष्पादन सोर्स पाठ में ''अगले केस'' के साथ जारी रखता है ("फॉलथ्रू" होता है)। फॉलथ्रू के द्वारा, एक ही बिंदु के साथ कई मान पूर्णतः कोई विशेष विधि के बिना मिल सकते हैं: वे बस एम्प्टी बॉडी के साथ सूचीबद्ध होते हैं। मानों को मामले के शरीर में कोड से विशेष शर्ताधारी किया जा सकता है। व्यावहारिक रूप से, फॉलथ्रू साधारण तौर पर मिलाने वाले शरीर के अंत में एक ब्रेक कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन को बंद कर देता है, लेकिन अगर प्रोग्रामर भूल जाता है तो यह अचानकी फॉलथ्रू के कारण बग्स का कारण बन सकता है। केस बॉडी में कोड के साथ मूल्यों को विशेष रूप से अनुकूलित किया जा सकता है। व्यवहार में, फॉलथ्रू को सामान्यतः मिलान निकाय के अंत में एक <code>break</code> कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन से बाहर निकलता है, लेकिन यदि प्रोग्रामर <code>break</code> स्टेटमेंट डालना भूल जाता है तो यह अनजाने में फॉलथ्रू के कारण बग उत्पन्न कर सकता है। इस प्रकार इसे कई लोगों द्वारा<ref>van der Linden, Peter (1994). ''Expert C Programming: Deep C Secrets'', p. 38. Prentice Hall, Eaglewood Cliffs. {{ISBN|0131774298}}.</ref> लैंगुएज के मस्से के रूप में देखा जाता है, और कुछ लिंट टूल्स में इसके प्रति चेतावनी दी जाती है। वाक्यात्मक रूप से, स्थितियों को लेबल के रूप में समझा जाता है, ब्लॉक के रूप में नहीं, और स्विच और <code>break</code> स्टेटमेंट स्पष्ट रूप से कण्ट्रोल प्रवाह को बदलते हैं। C से प्रभावित कुछ लैंगुएजेस, जैसे कि [[जावास्क्रिप्ट|JavaScript]], डिफॉल्ट फॉलथ्रू को बनाए रखती हैं, जबकि अन्य फॉलथ्रू को हटा देती हैं, या केवल विशेष परिस्थितियों में ही इसकी अनुमति देती हैं। सी-वर्ग में इस पर उल्लेखनीय विविधताओं में C# सम्मिलित है, जिसमें सभी ब्लॉकों को <code>break</code> या <code>return</code> के साथ समाप्त किया जाना चाहिए जब तक कि ब्लॉक खाली न हो (अर्थात फॉलथ्रू का उपयोग कई मान निर्दिष्ट करने के तरीके के रूप में किया जाता है)।


कुछ स्थितियों में languages वैकल्पिक फॉलथ्रू प्रदान करती हैं। उदाहरण के लिए, पर्ल डिफ़ॉल्ट रूप से विफल नहीं होता है, लेकिन एक केस <code>continue</code> कीवर्ड का उपयोग करके स्पष्ट रूप से ऐसा कर सकता है। यह अनजाने में गिरने से रोकता है लेकिन जब चाहे तब इसकी अनुमति देता है। इसी प्रकार, [[बैश (यूनिक्स शेल)|बैश]] डिफ़ॉल्ट रूप से <code>;;</code> के साथ समाप्त होने पर फ़ॉलथ्रू नहीं करता है, लेकिन इसके बजाय <code>;&</code> या <code>;;&</code>के साथ फॉलथ्रू<ref>since [http://git.savannah.gnu.org/cgit/bash.git/tree/NEWS?id=3185942a5234e26ab13fa02f9c51d340cec514f8#n111 version 4.0], released in 2009.</ref> की अनुमति देता है।
कुछ स्थितियों में लैंगुएजेस वैकल्पिक फॉलथ्रू प्रदान करती हैं। उदाहरण के लिए, पर्ल डिफ़ॉल्ट रूप से विफल नहीं होता है, लेकिन एक केस <code>continue</code> कीवर्ड का उपयोग करके स्पष्ट रूप से ऐसा कर सकता है। यह अनजाने में गिरने से रोकता है लेकिन जब चाहे तब इसकी अनुमति देता है। इसी प्रकार, [[बैश (यूनिक्स शेल)|बैश]] डिफ़ॉल्ट रूप से <code>;;</code> के साथ समाप्त होने पर फ़ॉलथ्रू नहीं करता है, लेकिन इसके बजाय <code>;&</code> या <code>;;&</code>के साथ फॉलथ्रू<ref>since [http://git.savannah.gnu.org/cgit/bash.git/tree/NEWS?id=3185942a5234e26ab13fa02f9c51d340cec514f8#n111 version 4.0], released in 2009.</ref> की अनुमति देता है।


स्विच स्टेटमेंट का एक उदाहरण जो फ़ॉलथ्रू पर निर्भर करता है वह डफ़ का उपकरण है।
स्विच स्टेटमेंट का एक उदाहरण जो फ़ॉलथ्रू पर निर्भर करता है वह डफ़ का उपकरण है।
Line 75: Line 75:
{{Unreferenced|section|date=January 2017}}
{{Unreferenced|section|date=January 2017}}


कुछ languages और प्रोग्रामिंग वातावरणों में, <code>case</code> या <code>switch</code> स्टेटमेंट का उपयोग ''if else if'' स्टेटमेंट की समकक्ष श्रृंखला से बेहतर माना जाता है क्योंकि यह है:
कुछ लैंगुएजेस और प्रोग्रामिंग वातावरणों में, <code>case</code> या <code>switch</code> स्टेटमेंट का उपयोग ''if else if'' स्टेटमेंट की समकक्ष श्रृंखला से बेहतर माना जाता है क्योंकि यह है:


* डिबग करना आसान है (उदाहरण के लिए कोड बनाम कॉल टेबल पर ब्रेकपॉइंट सेट करना, यदि डिबगर में कोई सशर्त ब्रेकपॉइंट क्षमता नहीं है)
* डिबग करना आसान है (उदाहरण के लिए कोड बनाम कॉल टेबल पर ब्रेकपॉइंट सेट करना, यदि डिबगर में कोई सशर्त ब्रेकपॉइंट क्षमता नहीं है)
Line 89: Line 89:
== एक्सप्रेशन स्विच करें ==
== एक्सप्रेशन स्विच करें ==


''स्विच एक्सप्रेशन'' Java एसई 12, 19 मार्च 2019 में एक पूर्वावलोकन सुविधा के रूप में प्रस्तुत किए गए हैं। यहां मान वापस करने के लिए संपूर्ण स्विच एक्सप्रेशन का उपयोग किया जा सकता है। केस लेबल का एक नया रूप भी है, {{code|case L-> }} जहां दाईं ओर एक एकल एक्सप्रेशन है। हालाँकि, यह फॉलथ्रू को भी रोकता है और इसके लिए आवश्यक है कि स्थिति विस्तृत हों। Java एसई 13 में <code>yield</code> स्टेटमेंट प्रस्तुत किया गया है, और Java एसई 14 में स्विच एक्सप्रेशन एक मानक language सुविधा बन जाता है।<ref>{{cite web|access-date=2021-04-28|title=JEP 325: Switch Expressions (Preview)|url=https://openjdk.java.net/jeps/325|website=openjdk.java.net}}</ref><ref>{{cite web|access-date=2021-04-28|title=JEP 354: Switch Expressions (Second Preview)|url=https://openjdk.java.net/jeps/354|website=openjdk.java.net}}</ref><ref>{{cite web|access-date=2021-04-28|title=JEP 361: Switch Expressions|url=https://openjdk.java.net/jeps/361|website=openjdk.java.net}}</ref> उदाहरण के लिए:
''स्विच एक्सप्रेशन'' Java एसई 12, 19 मार्च 2019 में एक पूर्वावलोकन सुविधा के रूप में प्रस्तुत किए गए हैं। यहां मान वापस करने के लिए संपूर्ण स्विच एक्सप्रेशन का उपयोग किया जा सकता है। केस लेबल का एक नया रूप भी है, {{code|case L-> }} जहां दाईं ओर एक एकल एक्सप्रेशन है। हालाँकि, यह फॉलथ्रू को भी रोकता है और इसके लिए आवश्यक है कि स्थिति विस्तृत हों। Java एसई 13 में <code>yield</code> स्टेटमेंट प्रस्तुत किया गया है, और Java एसई 14 में स्विच एक्सप्रेशन एक मानक लैंगुएज सुविधा बन जाता है।<ref>{{cite web|access-date=2021-04-28|title=JEP 325: Switch Expressions (Preview)|url=https://openjdk.java.net/jeps/325|website=openjdk.java.net}}</ref><ref>{{cite web|access-date=2021-04-28|title=JEP 354: Switch Expressions (Second Preview)|url=https://openjdk.java.net/jeps/354|website=openjdk.java.net}}</ref><ref>{{cite web|access-date=2021-04-28|title=JEP 361: Switch Expressions|url=https://openjdk.java.net/jeps/361|website=openjdk.java.net}}</ref> उदाहरण के लिए:
<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
int ndays = switch(month) {
int ndays = switch(month) {
Line 102: Line 102:
</syntaxhighlight>
</syntaxhighlight>
== वैकल्पिक उपयोग ==
== वैकल्पिक उपयोग ==
कई languages रनटाइम के दौरान <code>switch</code> ब्लॉक के अंदर एक्सप्रेशनयों का मूल्यांकन करती हैं, जिससे निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति मिलती है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग languages में अधिक साधारण है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड की तुलना में अधिक महत्वपूर्ण है।
कई लैंगुएजेस रनटाइम के दौरान <code>switch</code> ब्लॉक के अंदर एक्सप्रेशनयों का मूल्यांकन करती हैं, जिससे निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति मिलती है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग लैंगुएजेस में अधिक साधारण है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड की तुलना में अधिक महत्वपूर्ण है।


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


=== पीएचपी ===
=== पीएचपी ===
Line 144: Line 144:
   end</syntaxhighlight>
   end</syntaxhighlight>
=== असेंबलर ===
=== असेंबलर ===
असेंबली language में एक स्विच स्टेटमेंट:
असेंबली लैंगुएज में एक स्विच स्टेटमेंट:
<syntaxhighlight lang="nasm">
<syntaxhighlight lang="nasm">
switch:
switch:
Line 173: Line 173:
===पाइथन ===
===पाइथन ===


पाइथन 3.10.6 के लिए, [[पायथन संवर्धन प्रस्ताव|पीईपी]] 634-636 को स्वीकार किया गया, जिसमें {{code|lang=python|match}} और {{code|lang=python|case}} कीवर्ड जोड़े गए।<ref>{{Cite web |last=Galindo Salgado |first=Pablo |title=What's New In Python 3.10 |url=https://docs.python.org/3/whatsnew/3.10.html |access-date=2022-08-19 |website=Python 3.10.6 documentation}}</ref><ref>{{Cite web |last=Bucher |first=Brandt |last2=van Rossum |first2=Guido |author-link2=Guido van Rossum |date=2020-09-12 |title=PEP 634 – Structural Pattern Matching: Specification |url=https://peps.python.org/pep-0634/ |access-date=2022-08-19 |website=Python Enhancement Proposals}}</ref><ref>{{Cite web |last=Kohn |first=Tobias |author-link=Guido van Rossum |last2=van Rossum |first2=Guido |date=2020-09-12 |title=PEP 635 – Structural Pattern Matching: Motivation and Rationale |url=https://peps.python.org/pep-0635/ |access-date=2022-08-19 |website=Python Enhancement Proposals}}</ref><ref>{{Cite web |last=Moisset |first=Daniel F |title=PEP 636 – Structural Pattern Matching: Tutorial |url=https://peps.python.org/pep-0636/ |access-date=2022-08-19 |website=Python Enhancement Proposals}}</ref> अन्य languages के विपरीत, पाइथन विशेष रूप से पतनशील व्यवहार प्रदर्शित नहीं करता है।
पाइथन 3.10.6 के लिए, [[पायथन संवर्धन प्रस्ताव|पीईपी]] 634-636 को स्वीकार किया गया, जिसमें {{code|lang=python|match}} और {{code|lang=python|case}} कीवर्ड जोड़े गए।<ref>{{Cite web |last=Galindo Salgado |first=Pablo |title=What's New In Python 3.10 |url=https://docs.python.org/3/whatsnew/3.10.html |access-date=2022-08-19 |website=Python 3.10.6 documentation}}</ref><ref>{{Cite web |last=Bucher |first=Brandt |last2=van Rossum |first2=Guido |author-link2=Guido van Rossum |date=2020-09-12 |title=PEP 634 – Structural Pattern Matching: Specification |url=https://peps.python.org/pep-0634/ |access-date=2022-08-19 |website=Python Enhancement Proposals}}</ref><ref>{{Cite web |last=Kohn |first=Tobias |author-link=Guido van Rossum |last2=van Rossum |first2=Guido |date=2020-09-12 |title=PEP 635 – Structural Pattern Matching: Motivation and Rationale |url=https://peps.python.org/pep-0635/ |access-date=2022-08-19 |website=Python Enhancement Proposals}}</ref><ref>{{Cite web |last=Moisset |first=Daniel F |title=PEP 636 – Structural Pattern Matching: Tutorial |url=https://peps.python.org/pep-0636/ |access-date=2022-08-19 |website=Python Enhancement Proposals}}</ref> अन्य लैंगुएजेस के विपरीत, पाइथन विशेष रूप से पतनशील व्यवहार प्रदर्शित नहीं करता है।
<syntaxhighlight lang="py">
<syntaxhighlight lang="py">
letter = input("Put in a single letter: ").strip()[0].casefold() # first non-whitespace character of the input, lowercase
letter = input("Put in a single letter: ").strip()[0].casefold() # first non-whitespace character of the input, lowercase
Line 186: Line 186:
=== एक्सेप्शन हेंडलिंग ===
=== एक्सेप्शन हेंडलिंग ===


कई languages एक्सेप्शन हेंडलिंग में स्विच स्टेटमेंट के एक रूप को लागू करती हैं, जहाँ यदि किसी ब्लॉक में कोई एक्सेप्शन उठाया जाता है, तो एक्सेप्शन के आधार पर एक अलग ब्रांच चुनी जाती है। कुछ स्थितियों में, यदि कोई एक्सेप्शन नहीं उठाया गया है, तो एक डिफ़ॉल्ट ब्रांच भी विद्यमान है। एक प्रारंभिक उदाहरण मॉड्यूल-3 है, जो <code>TRY</code>...<code>EXCEPT</code> सिंटैक्स का उपयोग करता है, जहां प्रत्येक <code>EXCEPT</code> एक स्थिति को परिभाषित करता है। यह [[डेल्फ़ी (प्रोग्रामिंग भाषा)|डेल्फ़ी]], [[स्काला (प्रोग्रामिंग भाषा)|स्कैला]] और विज़ुअल बेसिक .NET में भी पाया जाता है।
कई लैंगुएजेस एक्सेप्शन हेंडलिंग में स्विच स्टेटमेंट के एक रूप को लागू करती हैं, जहाँ यदि किसी ब्लॉक में कोई एक्सेप्शन उठाया जाता है, तो एक्सेप्शन के आधार पर एक अलग ब्रांच चुनी जाती है। कुछ स्थितियों में, यदि कोई एक्सेप्शन नहीं उठाया गया है, तो एक डिफ़ॉल्ट ब्रांच भी विद्यमान है। एक प्रारंभिक उदाहरण मॉड्यूल-3 है, जो <code>TRY</code>...<code>EXCEPT</code> सिंटैक्स का उपयोग करता है, जहां प्रत्येक <code>EXCEPT</code> एक स्थिति को परिभाषित करता है। यह [[डेल्फ़ी (प्रोग्रामिंग भाषा)|डेल्फ़ी]], [[स्काला (प्रोग्रामिंग भाषा)|स्कैला]] और विज़ुअल बेसिक .NET में भी पाया जाता है।


== विकल्प ==
== विकल्प ==
Line 194: Line 194:
* ''if-else'' [[सशर्त (प्रोग्रामिंग)|सशर्त]] की एक श्रृंखला जो लक्ष्य की एक समय में मान की जांच करती है। फाल्थ्रू व्यवहार को ''else'' क्लॉज के बिना प्रत्येक सशर्त के अनुक्रम के साथ प्राप्त किया जा सकता है।
* ''if-else'' [[सशर्त (प्रोग्रामिंग)|सशर्त]] की एक श्रृंखला जो लक्ष्य की एक समय में मान की जांच करती है। फाल्थ्रू व्यवहार को ''else'' क्लॉज के बिना प्रत्येक सशर्त के अनुक्रम के साथ प्राप्त किया जा सकता है।
* एक लुकअप टेबल, जिसमें कुंजियों के रूप में, <code>case</code> मान और, मान के रूप में, <code>case</code> स्टेटमेंट के अंतर्गत भाग सम्मिलित होता है।
* एक लुकअप टेबल, जिसमें कुंजियों के रूप में, <code>case</code> मान और, मान के रूप में, <code>case</code> स्टेटमेंट के अंतर्गत भाग सम्मिलित होता है।
::(कुछ languages में, केवल वास्तविक डेटा प्रकारों को लुकअप तालिका में मान के रूप में अनुमति दी जाती है। अन्य languages में, वास्तविक <code>switch</code> स्टेटमेंट के समान लचीलापन प्राप्त करते हुए, लुकअप तालिका मान के रूप में फ़ंक्शन निर्दिष्ट करना भी संभव है। अधिक के लिए [[नियंत्रण तालिका|कण्ट्रोल तालिका]] आलेख देखें इस पर विस्तार से)।
::(कुछ लैंगुएजेस में, केवल वास्तविक डेटा प्रकारों को लुकअप तालिका में मान के रूप में अनुमति दी जाती है। अन्य लैंगुएजेस में, वास्तविक <code>switch</code> स्टेटमेंट के समान लचीलापन प्राप्त करते हुए, लुकअप तालिका मान के रूप में फ़ंक्शन निर्दिष्ट करना भी संभव है। अधिक के लिए [[नियंत्रण तालिका|कण्ट्रोल तालिका]] आलेख देखें इस पर विस्तार से)।
[[लुआ (प्रोग्रामिंग भाषा)|लुआ]] केस/स्विच स्टेटमेंट का समर्थन नहीं करता है।<ref name="lua">[http://lua-users.org/wiki/SwitchStatement Switch statement in Lua]</ref> यह लुकअप तकनीक लुआ language में <code>switch</code> स्टेटमेंट को लागू करने का एक तरीका है, जिसमें कोई अंतर्निहित <code>switch</code>नहीं है।<ref name="lua" />  कुछ स्थितियों में, लुकअप टेबल गैर-अनुकूलित <code>switch</code> स्टेटमेंट की तुलना में अधिक कुशल होते हैं क्योंकि कई languages टेबल लुकअप को अनुकूलित कर सकती हैं, जबकि स्विच स्टेटमेंट को तब तक अनुकूलित नहीं किया जाता है जब तक कि मानों की सीमा कुछ अंतराल के साथ छोटी न हो। हालाँकि, एक गैर-अनुकूलित, गैर-बाइनरी खोज लुकअप लगभग निश्चित रूप से एक गैर-अनुकूलित स्विच या समकक्ष एकाधिक यदि-अन्यथा स्टेटमेंट्स की तुलना में धीमा होगा।{{citation needed|date=October 2011}}
[[लुआ (प्रोग्रामिंग भाषा)|लुआ]] केस/स्विच स्टेटमेंट का समर्थन नहीं करता है।<ref name="lua">[http://lua-users.org/wiki/SwitchStatement Switch statement in Lua]</ref> यह लुकअप तकनीक लुआ लैंगुएज में <code>switch</code> स्टेटमेंट को लागू करने का एक तरीका है, जिसमें कोई अंतर्निहित <code>switch</code>नहीं है।<ref name="lua" />  कुछ स्थितियों में, लुकअप टेबल गैर-अनुकूलित <code>switch</code> स्टेटमेंट की तुलना में अधिक कुशल होते हैं क्योंकि कई लैंगुएजेस टेबल लुकअप को अनुकूलित कर सकती हैं, जबकि स्विच स्टेटमेंट को तब तक अनुकूलित नहीं किया जाता है जब तक कि मानों की सीमा कुछ अंतराल के साथ छोटी न हो। हालाँकि, एक गैर-अनुकूलित, गैर-बाइनरी खोज लुकअप लगभग निश्चित रूप से एक गैर-अनुकूलित स्विच या समकक्ष एकाधिक यदि-अन्यथा स्टेटमेंट्स की तुलना में धीमा होगा।{{citation needed|date=October 2011}}
*यदि आवश्यकता हो, तो एक कण्ट्रोल टेबल (जो एक साधारण लुकअप टेबल के रूप में कार्यान्वयन किया जा सकता है) भी एक से अधिक इनपुट पर एकाधिक स्थितियों को समायोजित करने के लिए अनुकूलित किया जा सकता है और सामन्यतः एक समान स्विच की तुलना में अधिक 'दृश्य संक्षेपता' दिखाता है (जो कई स्टेटमेंट को आवास कर सकता है)।
*यदि आवश्यकता हो, तो एक कण्ट्रोल टेबल (जो एक साधारण लुकअप टेबल के रूप में कार्यान्वयन किया जा सकता है) भी एक से अधिक इनपुट पर एकाधिक स्थितियों को समायोजित करने के लिए अनुकूलित किया जा सकता है और सामन्यतः एक समान स्विच की तुलना में अधिक 'दृश्य संक्षेपता' दिखाता है (जो कई स्टेटमेंट को आवास कर सकता है)।
*[[पैटर्न मिलान]], जिसका उपयोग कई [[कार्यात्मक प्रोग्रामिंग|कार्यात्मक]] languages में स्विच-जैसी कार्यक्षमता को कार्यान्वित करने के लिए किया जाता है।
*[[पैटर्न मिलान]], जिसका उपयोग कई [[कार्यात्मक प्रोग्रामिंग|कार्यात्मक]] लैंगुएजेस में स्विच-जैसी कार्यक्षमता को कार्यान्वित करने के लिए किया जाता है।


== यह भी देखें ==
== यह भी देखें ==

Revision as of 10:03, 26 July 2023

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

स्विच स्टेटमेंट कुछ कुछ C/C++, C#, विज़ुअल बेसिक .NET, Java जैसी प्रोग्रामिंग लैंगुएजेस में उपयोग किए जाने वाले if स्टेटमेंट के समान कार्य करते हैं और अधिकांश उच्च स्तरीय अत्यावश्यक प्रोग्रामिंग लैंगुएजेस जैसे Pascal, Ada, C/C++, C#,[1]: 157–167   विज़ुअल बेसिक .NET, Java,[2] : 157–167  और कई अन्य प्रकार की लैंगुएज में विद्यमान हैं, जिनमें switch, case, select या inspectजैसे कीवर्ड का उपयोग किया जाता है।

स्विच स्टेटमेंट दो मुख्य प्रकार के होते हैं: पास्कल जैसे स्ट्रक्चर्ड स्विच जो यथार्थतः एक ब्रांच प्राप्त करता है, और C जैसे अनस्ट्रक्चर्ड स्विच जो एक तरह के गोटू के रूप में काम करता है। स्विच का उपयोग करने के मुख्य कारण में से एक यह है कि यह स्पष्टता को उत्कृष्ट बनाने में सहायता करता है, क्योंकि इससे पुनरावृत्तीय कोडिंग को कम किया जा सकता है, और (यदि ह्यूरिस्टिक्स अनुमति प्रदान करती है) बहुत से स्थितियों में सहज कंपाइलर अनुकूलन के माध्यम से तेज निष्पादन की संभावना भी प्रदान करता है।

C में स्विच स्टेटमेंट
switch (age) {
  case 1:  printf("You're one.");            break;
  case 2:  printf("You're two.");            break;
  case 3:  printf("You're three.");
  case 4:  printf("You're three or four.");  break;
  default: printf("You're not 1, 2, 3 or 4!");
}

इतिहास

इसके 1952 के पाठ इंट्रोडक्शन टू मेटामैथेमेटिक्स में, स्टीफन क्लीन ने औपचारिक रूप से प्रमाणित कर दिया कि CASE फ़ंक्शन (IF-THEN-ELSE फ़ंक्शन इसका सबसे सरल रूप है) एक प्राथमिक पुनरावर्ती फंक्शन (प्रिमिटिव रिकर्सिव फंक्शन) है, जहां उन्होंने definition by cases की अवधारणा को निम्नलिखित तरीके से परिभाषित किया है:

"#F. फंक्शन φ इस प्रकार परिभाषित किया गया है
φ(x1 , ... , xn ) =
  • φ1(x1 , ... , xn ) if Q1(x1 , ... , xn ),
  • . . . . . . . . . . . .
  • φm(x1 , ... , xn ) if Qm(x1 , ... , xn ),
  • φm+1(x1 , ... , xn ) अन्यथा, जहां Q1 , ... , Qm परस्पर एक्सक्लूसिव प्रेडिकटेस हैं (या φ(x1 , ... , xn) का मान लागू होने वाले पहले परिच्छेद (क्लॉज़) द्वारा दिया जाएगा) φ1, ..., φm+1, Q1, ..., Qm+1 में प्रिमिटिव रिकर्सिव है।[3]

क्लीन बूलियन-जैसे रिकर्सिव फंक्शन "साइन-ऑफ़" sg( ) और "नॉट साइन ऑफ़" ~sg( ) के संदर्भ में इसका प्रमाण प्रदान करता है (क्लीन 1952:222-223); यदि इसका इनपुट सकारात्मक है तो सर्वप्रथम 1 लौटाता है और यदि इसका इनपुट नकारात्मक है तो −1 लौटाता है।

बूलोस-बर्गेस-जेफरी ने अतिरिक्त अवलोकन किया कि "डेफिनिशन बाय केसेस" को साथ ही म्युचली एक्सक्लूसिव और म्युचली एक्सहॉस्टिव होना आवश्यक है। वे भी इस फ़ंक्शन की प्रिमिटिव रिकर्सिवनेस्स का प्रमाण देते हैं (बूलोस-बर्गेस-जेफरी 2002:74-75)।

IF-THEN-ELSE मैकार्थी फोरमालिस्म का आधार है: इसका उपयोग प्रिमिटिव रिकर्सन और म्यू-ऑपरेटर दोनों को प्रतिस्थापित करता है।

विशिष्ट सिंटेक्स

अधिकांश लैंगुएजेस में, प्रोग्रामर एक या दो कीवर्ड का उपयोग करके कई एकाकी लाइनों में स्विच स्टेटमेंट लिखते हैं। एक सामान्य सिंटेक्स में सम्मिलित हैं:

  • सर्वप्रथम select, उसके बाद एक एक्सप्रेशन जिसे प्रायः स्विच स्टेटमेंट की कण्ट्रोल एक्सप्रेशन या कण्ट्रोल वेरिएबल के रूप में संदर्भित किया जाता है
  • वास्तविक स्थितियों (मूल्यों) को परिभाषित करने वाली बाद की पंक्तियाँ, मिलान होने पर निष्पादन के लिए बयानों के संगत अनुक्रम के साथ
  • फॉलथ्रू बिहेवियर वाली लैंगुएजेस में, break स्टेटमेंट सामान्यतः उक्त स्टेटमेंट को समाप्त करने के लिए case स्टेटमेंट का अनुसरण करता है। [वेल्स]
  • कुछ लैंगुएजेस में, जैसे, पीएल/आई, कण्ट्रोल एक्सप्रेशन वैकल्पिक है; यदि कोई कण्ट्रोल एक्सप्रेशन नहीं है, तो प्रत्येक विकल्प एक बूलियन एक्सप्रेशन वाले WHEN क्लॉज से शुरू होता है और पहले स्थिति के लिए एक मिलान होता है जिसके लिए वह एक्सप्रेशन सही मूल्यांकन करती है। यह उपयोग कुछ अन्य लैंगुएजेस में if/then/elseif/else संरचनाओं के समान है, उदाहरण के लिए, पर्ल
  • कुछ लैंगुएजेस में, उदाहरण के लिए, Rexx, किसी भी कण्ट्रोल एक्सप्रेशन की अनुमति नहीं है और प्रत्येक विकल्प एक बूलियन एक्सप्रेशन वाले WHEN क्लॉज से शुरू होता है और पहले स्थिति के लिए एक मिलान होता है जिसके लिए वह एक्सप्रेशन सत्य का मूल्यांकन करती है।

प्रत्येक विकल्प विशेष मान, या मानों की सूची (नीचे देखें) से शुरू होता है, जिससे कण्ट्रोल चर मेल खा सकता है और जो कण्ट्रोल को स्टेटमेंट्स के संगत अनुक्रम में ले जाने का कारण बनेगा। मान (या मानों की सूची/श्रेणी) को सामान्यतः संबंधित स्टेटमेंट अनुक्रम से एक कोलन या एक निहितार्थ एरो द्वारा अलग किया जाता है। कई लैंगुएजेस में, प्रत्येक केस के पहले कोई कीवर्ड भी होना चाहिए जैसे कि case या when

वैकल्पिक डिफ़ॉल्ट स्थिति की भी सामान्यतः अनुमति होती है, जो default, otherwise, या else कीवर्ड द्वारा निर्दिष्ट होता है। यह तब निष्पादित होता है जब कोई अन्य मामला कण्ट्रोल एक्सप्रेशन से मेल नहीं खाता है। कुछ लैंगुएजेस में, जैसे कि C, यदि कोई भी स्थिति समतुल्य नहीं होती है और default को छोड़ दिया जाता है तो switch स्टेटमेंट बस समाप्त हो जाता है। अन्य में, जैसे पीएल/आई में, एक त्रुटि उत्पन्न होती है।

शब्दार्थ

शब्दार्थ की दृष्टि से, स्विच स्टेटमेंट के दो मुख्य रूप हैं।

सर्वप्रथम रूप स्ट्रक्चर्ड स्विच है, जैसे पास्कल में, जहां यथार्थतः एक ब्रांच प्राप्त करता है, और स्थितियों को अलग, विशिष्ट ब्लॉक के रूप में माना जाता है। यह एक सामान्यीकृत if–then–else सशर्त के रूप में कार्य करता है, यहाँ केवल दो नहीं बल्कि किसी भी संख्या में ब्रांचएँ होती हैं।

दूसरा रूप अनस्ट्रक्चर्ड स्विच है, जैसा कि C में है, जहां स्थितियों को एक ही ब्लॉक के भीतर लेबल के रूप में माना जाता है, और स्विच एक सामान्यीकृत गोटो के रूप में कार्य करता है। इस भेद को फॉलथ्रू के उपचार के रूप में जाना जाता है, जिसे नीचे विस्तार से बताया गया है।

फाल्थ्रू

कई लैंगुएजेस में, केवल समतुल्य ब्लॉक को निष्पादित किया जाता है, और फिर स्विच स्टेटमेंट के अंत में निष्पादन सतत रहता है। इनमें पास्कल वर्ग (ऑब्जेक्ट पास्कल, मोडुला, ओबेरॉन, एडा, आदि) के साथ-साथ पीएल/आई, फोरट्रान के आधुनिक रूप और पास्कल से प्रभावित बेसिक बोलियाँ, अधिकांश कार्यात्मक लैंगुएजेस और कई अन्य सम्मिलित हैं। एक ही कोड को निष्पादित करने के लिए कई मानों की अनुमति देने के लिए (और डुप्लिकेट कोड करने की आवश्यकता से बचने के लिए), पास्कल-प्रकार की लैंगुएजेस प्रति स्थिति में किसी भी संख्या में मानों की अनुमति देती हैं, जो अल्पविराम से अलग की गई सूची के रूप में, एक श्रेणी के रूप में या एक संयोजन के रूप में दी जाती हैं।

C लैंगुएज से प्रगत लैंगुएजेस और अधिक सामान्य रूप से फोरट्रान के गणना की गई जीओटीओ से प्रभावित लैंगुएजेस, फॉलथ्रू का प्रदर्शन करती हैं। इसमें कण्ट्रोल मिलता है जो मिलाने वाले केस में जाता है, और फिर निष्पादन सोर्स पाठ में अगले केस के साथ जारी रखता है ("फॉलथ्रू" होता है)। फॉलथ्रू के द्वारा, एक ही बिंदु के साथ कई मान पूर्णतः कोई विशेष विधि के बिना मिल सकते हैं: वे बस एम्प्टी बॉडी के साथ सूचीबद्ध होते हैं। मानों को मामले के शरीर में कोड से विशेष शर्ताधारी किया जा सकता है। व्यावहारिक रूप से, फॉलथ्रू साधारण तौर पर मिलाने वाले शरीर के अंत में एक ब्रेक कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन को बंद कर देता है, लेकिन अगर प्रोग्रामर भूल जाता है तो यह अचानकी फॉलथ्रू के कारण बग्स का कारण बन सकता है। केस बॉडी में कोड के साथ मूल्यों को विशेष रूप से अनुकूलित किया जा सकता है। व्यवहार में, फॉलथ्रू को सामान्यतः मिलान निकाय के अंत में एक break कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन से बाहर निकलता है, लेकिन यदि प्रोग्रामर break स्टेटमेंट डालना भूल जाता है तो यह अनजाने में फॉलथ्रू के कारण बग उत्पन्न कर सकता है। इस प्रकार इसे कई लोगों द्वारा[4] लैंगुएज के मस्से के रूप में देखा जाता है, और कुछ लिंट टूल्स में इसके प्रति चेतावनी दी जाती है। वाक्यात्मक रूप से, स्थितियों को लेबल के रूप में समझा जाता है, ब्लॉक के रूप में नहीं, और स्विच और break स्टेटमेंट स्पष्ट रूप से कण्ट्रोल प्रवाह को बदलते हैं। C से प्रभावित कुछ लैंगुएजेस, जैसे कि JavaScript, डिफॉल्ट फॉलथ्रू को बनाए रखती हैं, जबकि अन्य फॉलथ्रू को हटा देती हैं, या केवल विशेष परिस्थितियों में ही इसकी अनुमति देती हैं। सी-वर्ग में इस पर उल्लेखनीय विविधताओं में C# सम्मिलित है, जिसमें सभी ब्लॉकों को break या return के साथ समाप्त किया जाना चाहिए जब तक कि ब्लॉक खाली न हो (अर्थात फॉलथ्रू का उपयोग कई मान निर्दिष्ट करने के तरीके के रूप में किया जाता है)।

कुछ स्थितियों में लैंगुएजेस वैकल्पिक फॉलथ्रू प्रदान करती हैं। उदाहरण के लिए, पर्ल डिफ़ॉल्ट रूप से विफल नहीं होता है, लेकिन एक केस continue कीवर्ड का उपयोग करके स्पष्ट रूप से ऐसा कर सकता है। यह अनजाने में गिरने से रोकता है लेकिन जब चाहे तब इसकी अनुमति देता है। इसी प्रकार, बैश डिफ़ॉल्ट रूप से ;; के साथ समाप्त होने पर फ़ॉलथ्रू नहीं करता है, लेकिन इसके बजाय ;& या ;;&के साथ फॉलथ्रू[5] की अनुमति देता है।

स्विच स्टेटमेंट का एक उदाहरण जो फ़ॉलथ्रू पर निर्भर करता है वह डफ़ का उपकरण है।

संकलन

ऑप्टिमाइजिंग कंपाइलर जैसे जीसीसी या क्लैंग स्विच स्टेटमेंट को या तो एक ब्रांच टेबल में या फिर केसेस में विद्यमान मानों के माध्यम से एक बाइनरी सर्च के रूप में कंपाइल कर सकते हैं।[6] एक ब्रांच टेबल को स्विच स्टेटमेंट को एक छोटे, स्थिर संख्यक निर्देशिका के रूप में कार्यान्वयन करने देता है जिससे कंपेयर को तुलनाओं की सूची से बिना जाना के विभाजन करने के लिए निर्देशिका में से निर्दिष्ट ब्रांच का निष्पादन करने में सक्षम होता है, जबकि बाइनरी सर्च में केवल लॉगारिदमिक संख्या की तुलना में कम्पेयरिजन होती है, जो स्विच स्टेटमेंट में केसेस की संख्या मापता है।

सामान्यतः, यह पता लगाने का एकमात्र तरीका कि यह अनुकूलन हुआ है या नहीं, वास्तव में कंपाइलर द्वारा उत्पन्न परिणामी असेंबली या मशीन कोड आउटपुट को देखना है।

लाभ और हानि

कुछ लैंगुएजेस और प्रोग्रामिंग वातावरणों में, case या switch स्टेटमेंट का उपयोग if else if स्टेटमेंट की समकक्ष श्रृंखला से बेहतर माना जाता है क्योंकि यह है:

  • डिबग करना आसान है (उदाहरण के लिए कोड बनाम कॉल टेबल पर ब्रेकपॉइंट सेट करना, यदि डिबगर में कोई सशर्त ब्रेकपॉइंट क्षमता नहीं है)
  • किसी व्यक्ति के लिए पढ़ना आसान है
  • समझना आसान है, और परिणामस्वरूप बनाए रखना आसान है
  • निश्चित गहराई: "if else if" स्टेटमेंट्स का एक क्रम गहरी नेस्टिंग उत्पन्न कर सकता है, जिससे संकलन अधिक कठिन हो जाता है (विशेषकर स्वचालित रूप से उत्पन्न कोड में)
  • यह सत्यापित करना आसान है कि सभी मान संभाले गए हैं। कंपाइलर्स यदि कुछ एनम मानों को संभाला न जाए तो चेतावनी जारी कर सकते हैं।

इसके अतिरिक्त, एक अनुकूलित कार्यान्वयन विकल्प की तुलना में बहुत तेजी से निष्पादित हो सकता है, क्योंकि इसे प्रायः अनुक्रमित ब्रांच तालिका का उपयोग करके कार्यान्वित किया जाता है।[7] उदाहरण के लिए, एकल वर्ण के मान के आधार पर प्रोग्राम प्रवाह तय करना, यदि सही ढंग से लागू किया जाता है, तो विकल्प की तुलना में काफी अधिक कुशल है, जिससे निर्देश पथ की लंबाई काफी कम हो जाती है। जब इसे इस प्रकार लागू किया जाता है, तो एक स्विच स्टेटमेंट अनिवार्य रूप से एक आदर्श हैश बन जाता है।

कण्ट्रोल-प्रवाह ग्राफ के संदर्भ में, एक स्विच स्टेटमेंट में दो नोड्स (प्रवेश और निकास) होते हैं, साथ ही प्रत्येक विकल्प के लिए उनके बीच एक किनारा होता है। इसके विपरीत, "if...else if...else if" स्टेटमेंट्स के अनुक्रम में पहले और अंतिम के अलावा प्रत्येक स्थिति के लिए एक अतिरिक्त नोड होता है, साथ में संगत किनारा भी होता है। इस प्रकार "if" के अनुक्रमों के लिए परिणामी कण्ट्रोल-प्रवाह ग्राफ़ में कई अधिक नोड्स और लगभग दोगुने किनारे होते हैं, इनमें कोई उपयोगी जानकारी नहीं जोड़ी जाती है। हालाँकि, if स्टेटमेंट्स में सरल ब्रांचएँ स्विच स्टेटमेंट की जटिल ब्रांच की तुलना में व्यक्तिगत रूप से वैचारिक रूप से आसान होती हैं। चक्रीय जटिलता के संदर्भ में, यदि k स्थिति दिए जाएं तो ये दोनों विकल्प इसे k-1 तक बढ़ा देते हैं।

एक्सप्रेशन स्विच करें

स्विच एक्सप्रेशन Java एसई 12, 19 मार्च 2019 में एक पूर्वावलोकन सुविधा के रूप में प्रस्तुत किए गए हैं। यहां मान वापस करने के लिए संपूर्ण स्विच एक्सप्रेशन का उपयोग किया जा सकता है। केस लेबल का एक नया रूप भी है, case L-> जहां दाईं ओर एक एकल एक्सप्रेशन है। हालाँकि, यह फॉलथ्रू को भी रोकता है और इसके लिए आवश्यक है कि स्थिति विस्तृत हों। Java एसई 13 में yield स्टेटमेंट प्रस्तुत किया गया है, और Java एसई 14 में स्विच एक्सप्रेशन एक मानक लैंगुएज सुविधा बन जाता है।[8][9][10] उदाहरण के लिए:

int ndays = switch(month) {
    case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31;
    case APR, JUN, SEP, NOV -> 30;
    case FEB -> {
        if (year % 400 == 0) yield 29;
        else if (year % 100 == 0) yield 28;
        else if (year % 4 == 0) yield 29;
        else yield 28; }
};

वैकल्पिक उपयोग

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

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

पीएचपी

उदाहरण के लिए, पीएचपी में, एक कोन्स्टेंट को "वेरिएबल" के रूप में उपयोग किया जा सकता है जिसके खिलाफ जाँच की जाएगी, और जिस पहले केस स्टेटमेंट का मूल्यांकन उस कोन्स्टेंट के लिए होता है उसे निष्पादित किया जाएगा:

switch (true) {
    case ($x == 'hello'):
        foo();
        break;
    case ($z == 'howdy'): break;
}
switch (5) {
    case $x: break;
    case $y: break;
}

यह सुविधा कई मानों के विरुद्ध एक चर की तुलना में एक मान के विरुद्ध अनेक चरों की जाँच करने के लिए भी उपयोगी है। COBOL EVALUATE स्टेटमेंट में इस फॉर्म (और अन्य फॉर्म) का भी समर्थन करता है। पीएल/आई के पास SELECT स्टेटमेंट का एक वैकल्पिक रूप है जहां कण्ट्रोल एक्सप्रेशन पूरी तरह से छोड़ दी जाती है और सत्य का मूल्यांकन करने वाला सर्वप्रथम WHEN निष्पादित किया जाता है।

रूबी

रूबी में, === समानता से निपटने के कारण, स्टेटमेंट का उपयोग चर की कक्षा के परीक्षण के लिए किया जा सकता है:

case input
when Array then puts 'input is an Array!'
when Hash then puts 'input is a Hash!'
end

रूबी एक मान भी लौटाती है जिसे एक वेरिएबल को सौंपा जा सकता है, और वास्तव में case को किसी भी पैरामीटर की आवश्यकता नहीं होती है (कुछ else if की तरह कार्य करते हुए):

catfood =
  case
  when cat.age <= 1
    junior
  when cat.age > 10
    senior
  else
    normal
  end

असेंबलर

असेंबली लैंगुएज में एक स्विच स्टेटमेंट:

switch:
  cmp ah, 00h
  je a
  cmp ah, 01h
  je b
  jmp swtend   ; No cases match or "default" code here
a:
  push ah
  mov al, 'a'
  mov ah, 0Eh
  mov bh, 00h
  int 10h
  pop ah
  jmp swtend   ; Equivalent to "break"
b:
  push ah
  mov al, 'b'
  mov ah, 0Eh
  mov bh, 00h
  int 10h
  pop ah
  jmp swtend   ; Equivalent to "break"
  ...
swtend:

पाइथन

पाइथन 3.10.6 के लिए, पीईपी 634-636 को स्वीकार किया गया, जिसमें match और case कीवर्ड जोड़े गए।[11][12][13][14] अन्य लैंगुएजेस के विपरीत, पाइथन विशेष रूप से पतनशील व्यवहार प्रदर्शित नहीं करता है।

letter = input("Put in a single letter: ").strip()[0].casefold() # first non-whitespace character of the input, lowercase
match letter:
  case 'a' | 'e' | 'i' | 'o' | 'u': # Unlike conditions in if statements, the `or` keyword cannot be used here to differentiate between cases
    print(f"Letter {letter} is a vowel!")
  case 'y':
    print(f"Letter {letter} may be a vowel.)
  case _: # `case _` is equivalent to `default` from C and others
    print(f"Letter {letter} is not a vowel!")

एक्सेप्शन हेंडलिंग

कई लैंगुएजेस एक्सेप्शन हेंडलिंग में स्विच स्टेटमेंट के एक रूप को लागू करती हैं, जहाँ यदि किसी ब्लॉक में कोई एक्सेप्शन उठाया जाता है, तो एक्सेप्शन के आधार पर एक अलग ब्रांच चुनी जाती है। कुछ स्थितियों में, यदि कोई एक्सेप्शन नहीं उठाया गया है, तो एक डिफ़ॉल्ट ब्रांच भी विद्यमान है। एक प्रारंभिक उदाहरण मॉड्यूल-3 है, जो TRY...EXCEPT सिंटैक्स का उपयोग करता है, जहां प्रत्येक EXCEPT एक स्थिति को परिभाषित करता है। यह डेल्फ़ी, स्कैला और विज़ुअल बेसिक .NET में भी पाया जाता है।

विकल्प

स्टेटमेंट्स को बदलने के कुछ विकल्प हो सकते हैं:

  • if-else सशर्त की एक श्रृंखला जो लक्ष्य की एक समय में मान की जांच करती है। फाल्थ्रू व्यवहार को else क्लॉज के बिना प्रत्येक सशर्त के अनुक्रम के साथ प्राप्त किया जा सकता है।
  • एक लुकअप टेबल, जिसमें कुंजियों के रूप में, case मान और, मान के रूप में, case स्टेटमेंट के अंतर्गत भाग सम्मिलित होता है।
(कुछ लैंगुएजेस में, केवल वास्तविक डेटा प्रकारों को लुकअप तालिका में मान के रूप में अनुमति दी जाती है। अन्य लैंगुएजेस में, वास्तविक switch स्टेटमेंट के समान लचीलापन प्राप्त करते हुए, लुकअप तालिका मान के रूप में फ़ंक्शन निर्दिष्ट करना भी संभव है। अधिक के लिए कण्ट्रोल तालिका आलेख देखें इस पर विस्तार से)।

लुआ केस/स्विच स्टेटमेंट का समर्थन नहीं करता है।[15] यह लुकअप तकनीक लुआ लैंगुएज में switch स्टेटमेंट को लागू करने का एक तरीका है, जिसमें कोई अंतर्निहित switchनहीं है।[15] कुछ स्थितियों में, लुकअप टेबल गैर-अनुकूलित switch स्टेटमेंट की तुलना में अधिक कुशल होते हैं क्योंकि कई लैंगुएजेस टेबल लुकअप को अनुकूलित कर सकती हैं, जबकि स्विच स्टेटमेंट को तब तक अनुकूलित नहीं किया जाता है जब तक कि मानों की सीमा कुछ अंतराल के साथ छोटी न हो। हालाँकि, एक गैर-अनुकूलित, गैर-बाइनरी खोज लुकअप लगभग निश्चित रूप से एक गैर-अनुकूलित स्विच या समकक्ष एकाधिक यदि-अन्यथा स्टेटमेंट्स की तुलना में धीमा होगा।[citation needed]

  • यदि आवश्यकता हो, तो एक कण्ट्रोल टेबल (जो एक साधारण लुकअप टेबल के रूप में कार्यान्वयन किया जा सकता है) भी एक से अधिक इनपुट पर एकाधिक स्थितियों को समायोजित करने के लिए अनुकूलित किया जा सकता है और सामन्यतः एक समान स्विच की तुलना में अधिक 'दृश्य संक्षेपता' दिखाता है (जो कई स्टेटमेंट को आवास कर सकता है)।
  • पैटर्न मिलान, जिसका उपयोग कई कार्यात्मक लैंगुएजेस में स्विच-जैसी कार्यक्षमता को कार्यान्वित करने के लिए किया जाता है।

यह भी देखें

संदर्भ

  1. Bloch, Joshua (2018). "Effective Java: Programming Language Guide" (third ed.). Addison-Wesley. ISBN 978-0134685991.
  2. Bloch, Joshua (2018). "Effective Java: Programming Language Guide" (third ed.). Addison-Wesley. ISBN 978-0134685991.
  3. "Definition by cases", Kleene 1952:229
  4. van der Linden, Peter (1994). Expert C Programming: Deep C Secrets, p. 38. Prentice Hall, Eaglewood Cliffs. ISBN 0131774298.
  5. since version 4.0, released in 2009.
  6. Vlad Lazarenko. From Switch Statement Down to Machine Code
  7. Guntheroth, Kurt (April 27, 2016). अनुकूलित सी++. O'Reilly Media. p. 182. ISBN 9781491922033.
  8. "JEP 325: Switch Expressions (Preview)". openjdk.java.net. Retrieved 2021-04-28.
  9. "JEP 354: Switch Expressions (Second Preview)". openjdk.java.net. Retrieved 2021-04-28.
  10. "JEP 361: Switch Expressions". openjdk.java.net. Retrieved 2021-04-28.
  11. Galindo Salgado, Pablo. "What's New In Python 3.10". Python 3.10.6 documentation. Retrieved 2022-08-19.
  12. Bucher, Brandt; van Rossum, Guido (2020-09-12). "PEP 634 – Structural Pattern Matching: Specification". Python Enhancement Proposals. Retrieved 2022-08-19.
  13. Kohn, Tobias; van Rossum, Guido (2020-09-12). "PEP 635 – Structural Pattern Matching: Motivation and Rationale". Python Enhancement Proposals. Retrieved 2022-08-19.
  14. Moisset, Daniel F. "PEP 636 – Structural Pattern Matching: Tutorial". Python Enhancement Proposals. Retrieved 2022-08-19.
  15. 15.0 15.1 Switch statement in Lua


अग्रिम पठन