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

From Vigyanwiki
(Created page with "{{refimprove|date=April 2013}} {{short description|Type of selection control mechanism in computer programming languages}} कंप्यूटर प्रोग्रा...")
 
(minor changes)
Line 1: Line 1:
{{refimprove|date=April 2013}}
{{refimprove|date=April 2013}}
{{short description|Type of selection control mechanism in computer programming languages}}
{{short description|Type of selection control mechanism in computer programming languages}}
[[कंप्यूटर प्रोग्रामिंग भाषा]]ओं में, स्विच स्टेटमेंट एक प्रकार का चयन नियंत्रण तंत्र है जिसका उपयोग खोज और मानचित्र के माध्यम से प्रोग्राम निष्पादन के नियंत्रण प्रवाह को बदलने के लिए एक [[चर (प्रोग्रामिंग)]] या अभिव्यक्ति के मूल्य को अनुमति देने के लिए किया जाता है।
[[कंप्यूटर प्रोग्रामिंग भाषा|कंप्यूटर प्रोग्रामिंग भाषाओं]] में, स्विच स्टेटमेंट एक प्रकार का चयन नियंत्रण तंत्र है जिसका उपयोग एक [[चर (प्रोग्रामिंग)|चर]] या व्यक्ति व्यक्ति के मान को परिवर्तित करने के लिए किया जाता है ताकि कार्यक्रम के नियंत्रण विकल्प को खोजने और मैप करने के माध्यम से कार्यक्रम का निष्पादन बदल सके।


स्विच स्टेटमेंट कुछ हद तक इसी तरह कार्य करते हैं <code>if</code> [[सी (प्रोग्रामिंग भाषा)]]/[[सी++]], सी शार्प (प्रोग्रामिंग भाषा)|सी#, विजुअल बेसिक .NET, [[जावा (प्रोग्रामिंग भाषा)]] जैसी प्रोग्रामिंग भाषाओं में स्टेटमेंट का उपयोग किया जाता है और यह [[पास्कल (प्रोग्रामिंग भाषा)]] जैसी अधिकांश उच्च-स्तरीय [[अनिवार्य प्रोग्रामिंग]] भाषाओं में मौजूद है। , [[एडा (प्रोग्रामिंग भाषा)]], सी (प्रोग्रामिंग भाषा)/सी++, सी शार्प (प्रोग्रामिंग भाषा)|सी#,<ref name=Skeet>{{cite book |last=Skeet|first=Jon|title= सी# गहराई में|publisher= Manning |isbn= 978-1617294532}}</ref>{{rp|374-375}} विजुअल बेसिक .NET, जावा (प्रोग्रामिंग भाषा),<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}} और कई अन्य प्रकार की भाषा में, जैसे [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)]] का उपयोग करना <code>switch</code>, <code>case</code>, <code>select</code> या <code>inspect</code>.
स्विच स्टेटमेंट कुछ हद तक [[सी (प्रोग्रामिंग भाषा)|C/]][[सी++|C++]], C#, विज़ुअल बेसिक .NET, [[जावा (प्रोग्रामिंग भाषा)|Java]] जैसी प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले <code>if</code> स्टेटमेंट के समान कार्य करते हैं और अधिकांश उच्च स्तरीय [[अनिवार्य प्रोग्रामिंग]] भाषाओं जैसे [[पास्कल (प्रोग्रामिंग भाषा)|पास्कल]], [[एडा (प्रोग्रामिंग भाषा)|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,[2]: 157–167  और कई अन्य प्रकार की भाषा में मौजूद हैं, जिनमें <code>switch</code>, <code>case</code>, <code>select</code> या <code>inspect</code>जैसे [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)|कीवर्ड]] का उपयोग किया जाता है।


स्विच स्टेटमेंट दो मुख्य प्रकारों में आते हैं: एक संरचित स्विच, जैसे पास्कल में, जो बिल्कुल एक शाखा लेता है, और एक असंरचित स्विच, जैसा कि सी में, जो एक प्रकार के [[ के लिए जाओ ]] के रूप में कार्य करता है। स्विच का उपयोग करने के मुख्य कारणों में दोहराए जाने वाले कोडिंग को कम करके स्पष्टता में सुधार करना शामिल है, और (यदि अनुमान अनुमति देता है) कई मामलों में आसान कंपाइलर अनुकूलन के माध्यम से तेजी से निष्पादन की क्षमता भी प्रदान करता है।
स्विच स्टेटमेंट दो मुख्य प्रकारों में आते हैं: एक संरचित स्विच, जैसा कि पास्कल में होता है, जो बिल्कुल एक शाखा लेता है, और एक असंरचित स्विच, जैसा कि सी में होता है, जो एक प्रकार के [[ के लिए जाओ |गोटो]] के रूप में कार्य करता है। स्विच का उपयोग करने के मुख्य कारणों में दोहराए जाने वाले कोडिंग को कम करके स्पष्टता में सुधार करना और (यदि अनुमान अनुमति देता है) कई मामलों में आसान कंपाइलर अनुकूलन के माध्यम से तेजी से निष्पादन की क्षमता प्रदान करना शामिल है।
{| align="right"
{| align="right"
|+'''Switch statement in C'''
|+'''Switch statement in C'''
Line 18: Line 18:
</syntaxhighlight>
</syntaxhighlight>
|}
|}


== इतिहास ==
== इतिहास ==


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


: #एफ। फ़ंक्शन φ को इस प्रकार परिभाषित किया गया है
:"#F. The function φ defined thus
:: φ(x<sub>1</sub> , ... , एक्स<sub>n</sub> )=
:: φ(x<sub>1</sub> , ... , x<sub>n</sub> ) =
:::*फि<sub>1</sub>(एक्स<sub>1</sub> , ... , एक्स<sub>n</sub> ) यदि Q<sub>1</sub>(एक्स<sub>1</sub> , ... , एक्स<sub>n</sub> ),
:::* φ<sub>1</sub>(x<sub>1</sub> , ... , x<sub>n</sub> ) if Q<sub>1</sub>(x<sub>1</sub> , ... , x<sub>n</sub> ),
:::* . . . . . . . . . . . .
:::* . . . . . . . . . . . .
:::*फि<sub>m</sub>(एक्स<sub>1</sub> , ... , एक्स<sub>n</sub> ) यदि Q<sub>m</sub>(एक्स<sub>1</sub> , ... , एक्स<sub>n</sub> ),
:::* φ<sub>m</sub>(x<sub>1</sub> , ... , x<sub>n</sub> ) if Q<sub>m</sub>(x<sub>1</sub> , ... , x<sub>n</sub> ),
:::*फि<sub>m+1</sub>(एक्स<sub>1</sub> , ... , एक्स<sub>n</sub> ) अन्यथा,
:::* φ<sub>m+1</sub>(x<sub>1</sub> , ... , x<sub>n</sub> ) otherwise,  जहां Q<sub>1</sub> , ... , Q<sub>m</sub> परस्पर अनन्य विधेय हैं (या φ(x<sub>1</sub> , ... , x<sub>n</sub>) का मान लागू होने वाले पहले खंड द्वारा दिया जाएगा) φ<sub>1</sub>, ..., φ<sub>m+1</sub>, Q<sub>1</sub>, ..., Q<sub>m+1</sub> में आदिम पुनरावर्ती है।<ref>"Definition by cases", Kleene 1952:229</ref>
क्लेन बूलियन-जैसे पुनरावर्ती कार्यों "साइन-ऑफ़" sg( ) और "नॉट साइन ऑफ़" ~sg( ) के संदर्भ में इसका प्रमाण प्रदान करता है (क्लीन 1952:222-223); यदि इसका इनपुट सकारात्मक है तो पहला 1 लौटाता है और यदि इसका इनपुट नकारात्मक है तो −1 लौटाता है।


:कहां प्र<sub>1</sub> , ... , क्यू<sub>m</sub> परस्पर अनन्य विधेय हैं (या φ(x<sub>1</sub> , ... , एक्स<sub>n</sub>) में पहले खंड द्वारा दिया गया मान होगा जो लागू होता है) φ में आदिम पुनरावर्ती है<sub>1</sub>, ..., फ़ि<sub>m+1</sub>, क्यू<sub>1</sub>, ..., क्यू<sub>m+1</sub>.<ref>"Definition by cases", Kleene 1952:229</ref>
बूलोस-बर्गेस-जेफरी ने अतिरिक्त अवलोकन किया कि "मामलों द्वारा परिभाषा" [[पारस्परिक विशिष्टता|पारस्परिक]] रूप से अनन्य और सामूहिक रूप से संपूर्ण होनी चाहिए। वे भी इस फ़ंक्शन की आदिम पुनरावर्तीता का प्रमाण देते हैं (बूलोस-बर्गेस-जेफरी 2002:74-75)
क्लेन बूलियन-जैसे पुनरावर्ती कार्यों के संदर्भ में इसका प्रमाण प्रदान करता है - एसजी () का संकेत, न कि ~ एसजी () का संकेत (क्लीन 1952:222-223); यदि पहला इनपुट सकारात्मक है तो 1 लौटाता है और यदि इसका इनपुट नकारात्मक है तो -1 लौटाता है।


बूलोस-बर्गेस-जेफरी ने अतिरिक्त अवलोकन किया कि मामलों की परिभाषा [[पारस्परिक विशिष्टता]] और सामूहिक रूप से संपूर्ण दोनों होनी चाहिए। वे भी इस फ़ंक्शन की आदिम पुनरावर्तीता का प्रमाण प्रस्तुत करते हैं (बूलोस-बर्गेस-जेफरी 2002:74-75)।
IF-THEN-ELSE मैकार्थी औपचारिकता का आधार है: इसका उपयोग आदिम रिकर्सन और [[इन-ऑपरेटर|म्यू-ऑपरेटर]] दोनों को प्रतिस्थापित करता है।
 
IF-THEN-ELSE मैककार्थी औपचारिकता का आधार है: इसका उपयोग आदिम रिकर्सन और [[इन-ऑपरेटर]] दोनों को प्रतिस्थापित करता है।


== विशिष्ट वाक्यविन्यास ==
== विशिष्ट वाक्यविन्यास ==


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


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


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


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


== शब्दार्थ ==
== शब्दार्थ ==


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


पहला रूप संरचित स्विच है, जैसे पास्कल में, जहां बिल्कुल एक शाखा ली जाती है, और मामलों को अलग, विशिष्ट ब्लॉक के रूप में माना जाता है। यह एक सामान्यीकृत यदि-तब-अन्यथा [[सशर्त (कंप्यूटर प्रोग्रामिंग)]] के रूप में कार्य करता है, यहां केवल दो नहीं, बल्कि किसी भी संख्या में शाखाएं होती हैं।
पहला रूप संरचित स्विच है, जैसे पास्कल में, जहां वास्तव में एक शाखा ली जाती है, और मामलों को अलग, विशिष्ट ब्लॉक के रूप में माना जाता है। यह एक सामान्यीकृत यदि-तब-अन्यथा [[सशर्त (कंप्यूटर प्रोग्रामिंग)|सशर्त]] के रूप में कार्य करता है, यहाँ केवल दो नहीं बल्कि किसी भी संख्या में शाखाएँ होती हैं।


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


=== फाल्थ्रू ===
=== फाल्थ्रू ===


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


सी भाषा से प्राप्त भाषाएं, और आमतौर पर फोरट्रान की गणना की गई जीओटीओ से प्रभावित भाषाएं, इसके बजाय फॉलथ्रू की सुविधा देती हैं, जहां नियंत्रण मिलान वाले मामले में चला जाता है, और फिर स्रोत पाठ में अगले मामले से जुड़े बयानों के लिए निष्पादन जारी रहता है (गिरता है)यह कई मानों को बिना किसी विशेष वाक्यविन्यास के एक ही बिंदु से मेल खाने की अनुमति देता है: वे केवल खाली निकायों के साथ सूचीबद्ध होते हैं। मानों को केस बॉडी में कोड के साथ विशेष रूप से अनुकूलित किया जा सकता है। व्यवहार में, फॉलथ्रू को आमतौर पर एक के साथ रोका जाता है <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> या <code>return</code> जब तक कि ब्लॉक खाली न हो (यानी फ़ॉलथ्रू का उपयोग एकाधिक मान निर्दिष्ट करने के तरीके के रूप में किया जाता है)।
सी भाषा से प्राप्त भाषाएं, और आमतौर पर फोरट्रान की गणना की गई जीओटीओ से प्रभावित भाषाएं, इसके बजाय फॉलथ्रू की सुविधा देती हैं, जहां नियंत्रण मिलान मामले में चला जाता है, और फिर स्रोत पाठ में अगले मामले से जुड़े बयानों के लिए निष्पादन जारी रहता है ("गिरता है") . यह कई मानों को बिना किसी विशेष सिंटैक्स के एक ही बिंदु से मेल खाने की अनुमति देता है: वे बस खाली निकायों के साथ सूचीबद्ध होते हैं। केस बॉडी में कोड के साथ मूल्यों को विशेष रूप से अनुकूलित किया जा सकता है। व्यवहार में, फॉलथ्रू को आम तौर पर मिलान निकाय के अंत में एक <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> स्टेटमेंट स्पष्ट रूप से नियंत्रण प्रवाह को बदलते हैं। सी से प्रभावित कुछ भाषाएं, जैसे कि [[जावास्क्रिप्ट]], डिफॉल्ट फॉलथ्रू को बरकरार रखती हैं, जबकि अन्य फॉलथ्रू को हटा देती हैं, या केवल विशेष परिस्थितियों में ही इसकी अनुमति देती हैं। सी-परिवार में इस पर उल्लेखनीय विविधताओं में सी# शामिल है, जिसमें सभी ब्लॉकों को <code>break</code> या <code>return</code> के साथ समाप्त किया जाना चाहिए जब तक कि ब्लॉक खाली न हो (यानी फॉलथ्रू का उपयोग कई मान निर्दिष्ट करने के तरीके के रूप में किया जाता है)।


कुछ मामलों में भाषाएँ वैकल्पिक फ़ॉलथ्रू प्रदान करती हैं। उदाहरण के लिए, पर्ल डिफ़ॉल्ट रूप से विफल नहीं होता है, लेकिन कोई मामला स्पष्ट रूप से इसका उपयोग करके ऐसा कर सकता है <code>continue</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>;&</code> या <code>;;&</code> बजाय।
कुछ मामलों में भाषाएँ वैकल्पिक फॉलथ्रू प्रदान करती हैं। उदाहरण के लिए, पर्ल डिफ़ॉल्ट रूप से विफल नहीं होता है, लेकिन एक मामला <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> की अनुमति देता है।


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


== संकलन ==
== संकलन ==


[[अनुकूलन (कंप्यूटर विज्ञान)]] जैसे [[जीएनयू कंपाइलर संग्रह]] या [[बजना]] मामलों में मूल्यों के माध्यम से एक स्विच स्टेटमेंट को एक [[शाखा तालिका]] या [[बाइनरी खोज एल्गोरिदम]] में संकलित कर सकता है।<ref>Vlad Lazarenko. [https://web.archive.org/web/20220313040503/http://lazarenko.me/switch/ From Switch Statement Down to Machine Code]</ref>
[[अनुकूलन (कंप्यूटर विज्ञान)|ऑप्टिमाइजिंग कंपाइलर]] जैसे [[जीएनयू कंपाइलर संग्रह|GCC]] या [[बजना|Clang]] स्विच स्टेटमेंट को या तो एक [[शाखा तालिका|ब्रांच टेबल]] में या फिर केसेस में मौजूद मानों के माध्यम से एक [[बाइनरी खोज एल्गोरिदम|बाइनरी सर्च]] के रूप में कंपाइल कर सकते हैं।<ref>Vlad Lazarenko. [https://web.archive.org/web/20220313040503/http://lazarenko.me/switch/ From Switch Statement Down to Machine Code]</ref> एक ब्रांच टेबल को स्विच स्टेटमेंट को एक छोटे, स्थिर संख्यक निर्देशिका के रूप में कार्यान्वयन करने देता है जिससे कंपेयर को तुलनाओं की सूची से बिना जाना के विभाजन करने के लिए निर्देशिका में से निर्दिष्ट शाखा का निष्पादन करने में सक्षम होता है, जबकि बाइनरी सर्च में केवल लॉगारिदमिक संख्या की तुलना में कम्पेयरिजन होती है, जो स्विच स्टेटमेंट में केसेस की संख्या मापता है।
एक शाखा तालिका स्विच स्टेटमेंट को निर्देशों की एक छोटी, निरंतर संख्या के साथ यह निर्धारित करने की अनुमति देती है कि तुलना की सूची के बिना किस शाखा को निष्पादित करना है, जबकि एक बाइनरी खोज केवल तुलनाओं की एक लघुगणकीय संख्या लेती है, जिसे मामलों की संख्या में मापा जाता है। स्विच स्टेटमेंट.


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


==फायदे और नुकसान==
==फायदे और नुकसान==
{{Unreferenced|section|date=January 2017}}
{{Unreferenced|section|date=January 2017}}


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


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


इसके अतिरिक्त, एक अनुकूलन (कंप्यूटर विज्ञान) कार्यान्वयन विकल्प की तुलना में बहुत तेजी से निष्पादित हो सकता है, क्योंकि इसे अक्सर अनुक्रमित शाखा तालिका का उपयोग करके कार्यान्वित किया जाता है।<ref>{{cite book |last1=Guntheroth |first1=Kurt |title=अनुकूलित सी++|date=April 27, 2016 |publisher=O'Reilly Media |isbn=9781491922033 |page=182}}</ref> उदाहरण के लिए, किसी एकल वर्ण के मान के आधार पर प्रोग्राम प्रवाह तय करना, यदि सही ढंग से लागू किया जाता है, तो विकल्प की तुलना में बहुत अधिक कुशल होता है, जिससे [[निर्देश पथ की लंबाई]] काफी कम हो जाती है। जब इस तरह लागू किया जाता है, तो एक स्विच स्टेटमेंट अनिवार्य रूप से एक आदर्श हैश बन जाता है।
इसके अतिरिक्त, एक अनुकूलित कार्यान्वयन विकल्प की तुलना में बहुत तेजी से निष्पादित हो सकता है, क्योंकि इसे अक्सर अनुक्रमित शाखा तालिका का उपयोग करके कार्यान्वित किया जाता है।<ref>{{cite book |last1=Guntheroth |first1=Kurt |title=अनुकूलित सी++|date=April 27, 2016 |publisher=O'Reilly Media |isbn=9781491922033 |page=182}}</ref> उदाहरण के लिए, एकल वर्ण के मान के आधार पर प्रोग्राम प्रवाह तय करना, यदि सही ढंग से लागू किया जाता है, तो विकल्प की तुलना में काफी अधिक कुशल है, जिससे [[निर्देश पथ की लंबाई]] काफी कम हो जाती है। जब इसे इस प्रकार लागू किया जाता है, तो एक स्विच स्टेटमेंट अनिवार्य रूप से एक आदर्श हैश बन जाता है।


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


== अभिव्यक्ति स्विच करें ==
== अभिव्यक्ति स्विच करें ==


स्विच एक्सप्रेशन को पूर्वावलोकन सुविधा के रूप में जावा संस्करण इतिहास#जावा एसई 12, 19 मार्च 2019 में पेश किया गया है। यहां किसी मान को वापस करने के लिए संपूर्ण स्विच अभिव्यक्ति का उपयोग किया जा सकता है। केस लेबल का एक नया रूप भी है, {{code|case L-> }} जहां दाहिनी ओर एक एकल अभिव्यक्ति है। हालाँकि यह गिरावट को भी रोकता है और इसके लिए आवश्यक है कि मामले संपूर्ण हों। जावा एसई 13 में <code>yield</code> स्टेटमेंट पेश किया गया है, और जावा एसई 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> उदाहरण के लिए:
स्विच एक्सप्रेशन जावा एसई 12, 19 मार्च 2019 में एक पूर्वावलोकन सुविधा के रूप में पेश किए गए हैं। यहां एक मान वापस करने के लिए संपूर्ण स्विच एक्सप्रेशन का उपयोग किया जा सकता है। केस लेबल का एक नया रूप भी है, {{code|case L-> }} जहां दाईं ओर एक एकल अभिव्यक्ति है। हालाँकि, यह गिरावट को भी रोकता है और इसके लिए आवश्यक है कि मामले विस्तृत हों। जावा एसई 13 में <code>yield</code> स्टेटमेंट पेश किया गया है, और जावा एसई 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) {
     case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31;
     case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31;
Line 106: Line 102:
};
};
</syntaxhighlight>
</syntaxhighlight>
== वैकल्पिक उपयोग ==
कई भाषाएँ रनटाइम के दौरान <code>switch</code> ब्लॉक के अंदर अभिव्यक्तियों का मूल्यांकन करती हैं, जिससे निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति मिलती है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग भाषाओं में अधिक आम है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड की तुलना में अधिक महत्वपूर्ण है।


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


== वैकल्पिक उपयोग ==
=== PHP ===
कई भाषाएँ अंदर भावों का मूल्यांकन करती हैं <code>switch</code> रनटाइम पर ब्लॉक, निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति देता है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग भाषाओं में अधिक आम है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड से अधिक महत्वपूर्ण है।
उदाहरण के लिए, [[पीएचपी|PHP]]में, एक स्थिरांक को जांचने के लिए "चर" के रूप में उपयोग किया जा सकता है, और पहला केस स्टेटमेंट जो उस स्थिरांक का मूल्यांकन करता है, निष्पादित किया जाएगा:
 
=== [[पीएचपी]] ===
उदाहरण के लिए, PHP में, एक स्थिरांक को जांचने के लिए वेरिएबल के रूप में उपयोग किया जा सकता है, और उस स्थिरांक का मूल्यांकन करने वाला पहला केस स्टेटमेंट निष्पादित किया जाएगा:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
switch (true) {
switch (true) {
Line 125: Line 121:
}
}
</syntaxhighlight>
</syntaxhighlight>
यह सुविधा कई मानों के विरुद्ध एक चर के बजाय एकाधिक चर की जाँच करने के लिए भी उपयोगी है। COBOL भी इस फॉर्म (और अन्य फॉर्म) का समर्थन करता है <code>EVALUATE</code> कथन। पीएल/आई का एक वैकल्पिक रूप है <code>SELECT</code> कथन जहां नियंत्रण अभिव्यक्ति पूरी तरह से छोड़ दी गई है और पहला <code>WHEN</code> जो सत्य का मूल्यांकन करता है उसे निष्पादित किया जाता है।
यह सुविधा कई मानों के विरुद्ध एक चर की तुलना में एक मान के विरुद्ध अनेक चरों की जाँच करने के लिए भी उपयोगी है। COBOL <code>EVALUATE</code> स्टेटमेंट में इस फॉर्म (और अन्य फॉर्म) का भी समर्थन करता है। पीएल/आई के पास <code>SELECT</code> स्टेटमेंट का एक वैकल्पिक रूप है जहां नियंत्रण अभिव्यक्ति पूरी तरह से छोड़ दी जाती है और सत्य का मूल्यांकन करने वाला पहला <code>WHEN</code> निष्पादित किया जाता है।


=== रूबी ===
=== रूबी ===
[[रूबी (प्रोग्रामिंग भाषा)]] में, इसकी हैंडलिंग के कारण <code>===</code> समानता, कथन का उपयोग चर के वर्ग के परीक्षण के लिए किया जा सकता है:
[[रूबी (प्रोग्रामिंग भाषा)|रूबी]] में, <code>===</code> समानता से निपटने के कारण, कथन का उपयोग चर की कक्षा के परीक्षण के लिए किया जा सकता है:


<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
Line 136: Line 132:
end
end
</syntaxhighlight>
</syntaxhighlight>
रूबी एक मान भी लौटाती है जिसे एक वेरिएबल को सौंपा जा सकता है, और वास्तव में इसकी आवश्यकता नहीं होती है <code>case</code> कोई भी पैरामीटर रखना (थोड़ा-सा अभिनय करना)। <code>else if</code> कथन):
रूबी एक मान भी लौटाती है जिसे एक वेरिएबल को सौंपा जा सकता है, और वास्तव में <code>case</code> को किसी भी पैरामीटर की आवश्यकता नहीं होती है (कुछ <code>else if</code> की तरह कार्य करते हुए):


<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
Line 148: Line 144:
     normal
     normal
   end</syntaxhighlight>
   end</syntaxhighlight>
=== असेंबलर ===
=== असेंबलर ===
असेंबली भाषा में एक स्विच स्टेटमेंट:
असेंबली भाषा में एक स्विच स्टेटमेंट:
Line 182: Line 176:
===पायथन ===
===पायथन ===


पायथन 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> अन्य भाषाओं के विपरीत, पायथन विशेष रूप से फॉलथ्रू व्यवहार प्रदर्शित नहीं करता है।
पायथन 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 193: Line 187:
     print(f"Letter {letter} is not a vowel!")
     print(f"Letter {letter} is not a vowel!")
</syntaxhighlight>
</syntaxhighlight>
=== अपवाद हैंडलिंग ===
=== अपवाद हैंडलिंग ===


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


== विकल्प ==
== विकल्प ==


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


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


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

Revision as of 09:20, 21 July 2023

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

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

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

Switch statement in 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. The function φ defined thus
φ(x1 , ... , xn ) =
  • φ1(x1 , ... , xn ) if Q1(x1 , ... , xn ),
  • . . . . . . . . . . . .
  • φm(x1 , ... , xn ) if Qm(x1 , ... , xn ),
  • φm+1(x1 , ... , xn ) otherwise, जहां Q1 , ... , Qm परस्पर अनन्य विधेय हैं (या φ(x1 , ... , xn) का मान लागू होने वाले पहले खंड द्वारा दिया जाएगा) φ1, ..., φm+1, Q1, ..., Qm+1 में आदिम पुनरावर्ती है।[2]

क्लेन बूलियन-जैसे पुनरावर्ती कार्यों "साइन-ऑफ़" 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कीवर्ड द्वारा निर्दिष्ट होता है। यह तब निष्पादित होता है जब कोई अन्य मामला नियंत्रण अभिव्यक्ति से मेल नहीं खाता है। कुछ भाषाओं में, जैसे कि सी, यदि कोई भी मामला मेल नहीं खाता है और default को छोड़ दिया जाता है तो switch स्टेटमेंट बस बाहर निकल जाता है। अन्य में, जैसे पीएल/आई में, एक त्रुटि उत्पन्न होती है।

शब्दार्थ

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

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

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

फाल्थ्रू

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

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

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

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

संकलन

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

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

फायदे और नुकसान

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

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

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

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

अभिव्यक्ति स्विच करें

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

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

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

PHP

उदाहरण के लिए, PHPमें, एक स्थिरांक को जांचने के लिए "चर" के रूप में उपयोग किया जा सकता है, और पहला केस स्टेटमेंट जो उस स्थिरांक का मूल्यांकन करता है, निष्पादित किया जाएगा:

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 कीवर्ड जोड़े गए।[10][11][12][13] अन्य भाषाओं के विपरीत, पायथन विशेष रूप से पतनशील व्यवहार प्रदर्शित नहीं करता है।

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 में भी पाया जाता है।

विकल्प

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

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

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

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

यह भी देखें

संदर्भ

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


अग्रिम पठन