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

From Vigyanwiki
(Created page with "{{refimprove|date=April 2013}} {{short description|Type of selection control mechanism in computer programming languages}} कंप्यूटर प्रोग्रा...")
 
No edit summary
 
(7 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{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> स्टेटमेंट के समान कार्य करते हैं और अधिकांश उच्च स्तरीय [[अनिवार्य प्रोग्रामिंग|अत्यावश्यक]] प्रोग्रामिंग लैंगुएजेस  जैसे [[पास्कल (प्रोग्रामिंग भाषा)|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 जैसे अनस्ट्रक्चर्ड स्विच जो एक तरह के [[ के लिए जाओ |गोटू]] के रूप में काम करता है। स्विच का उपयोग करने के मुख्य कारण में से एक यह है कि यह स्पष्टता को उत्कृष्ट बनाने में सहायता करता है, क्योंकि इससे पुनरावृत्तीय कोडिंग को कम किया जा सकता है, और (यदि ह्यूरिस्टिक्स अनुमति प्रदान करती है) बहुत से स्थितियों में सहज कंपाइलर अनुकूलन के माध्यम से तेज निष्पादन की संभावना भी प्रदान करता है।
{| align="right"
{| align="right"
|+'''Switch statement in C'''
|+'''C में स्विच स्टेटमेंट'''
|<syntaxhighlight lang="c">
|<syntaxhighlight lang="c">
switch (age) {
switch (age) {
Line 18: Line 17:
</syntaxhighlight>
</syntaxhighlight>
|}
|}


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


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


: #एफ। फ़ंक्शन φ को इस प्रकार परिभाषित किया गया है
:"#F. फंक्शन φ इस प्रकार परिभाषित किया गया है
:: φ(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> ) अन्यथा,   जहां 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>
क्लेन बूलियन-जैसे पुनरावर्ती कार्यों के संदर्भ में इसका प्रमाण प्रदान करता है - एसजी () का संकेत, न कि ~ एसजी () का संकेत (क्लीन 1952:222-223); यदि पहला इनपुट सकारात्मक है तो 1 लौटाता है और यदि इसका इनपुट नकारात्मक है तो -1 लौटाता है।


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


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


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


दूसरा रूप असंरचित स्विच हैं, जैसे सी में, जहां मामलों को एक ही ब्लॉक के भीतर लेबल के रूप में माना जाता है, और स्विच एक सामान्यीकृत गोटो के रूप में कार्य करता है। इस भेद को फॉलथ्रू के उपचार के रूप में जाना जाता है, जिसका विवरण नीचे दिया गया है।
दूसरा रूप अनस्ट्रक्चर्ड स्विच है, जैसा कि 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> या <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> के साथ समाप्त किया जाना चाहिए जब तक कि ब्लॉक खाली न हो (अर्थात फॉलथ्रू का उपयोग कई मान निर्दिष्ट करने के तरीके के रूप में किया जाता है)।


कुछ मामलों में भाषाएँ वैकल्पिक फ़ॉलथ्रू प्रदान करती हैं। उदाहरण के लिए, पर्ल डिफ़ॉल्ट रूप से विफल नहीं होता है, लेकिन कोई मामला स्पष्ट रूप से इसका उपयोग करके ऐसा कर सकता है <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>
[[अनुकूलन (कंप्यूटर विज्ञान)|ऑप्टिमाइजिंग कंपाइलर]] जैसे [[जीएनयू कंपाइलर संग्रह|जीसीसी]] या [[बजना|क्लैंग]] स्विच स्टेटमेंट को या तो एक [[शाखा तालिका|ब्रांच टेबल]] में या फिर केसेस में विद्यमान मानों के माध्यम से एक [[बाइनरी खोज एल्गोरिदम|बाइनरी सर्च]] के रूप में कंपाइल कर सकते हैं।<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'' स्टेटमेंट की समकक्ष श्रृंखला से बेहतर माना जाता है क्योंकि यह है:


* डिबग करना आसान (उदाहरण के लिए कोड बनाम कॉल टेबल पर ब्रेकप्वाइंट सेट करना, यदि डिबगर में कोई सशर्त ब्रेकप्वाइंट क्षमता नहीं है)
* डिबग करना आसान है (उदाहरण के लिए कोड बनाम कॉल टेबल पर ब्रेकपॉइंट सेट करना, यदि डिबगर में कोई सशर्त ब्रेकपॉइंट क्षमता नहीं है)
* किसी व्यक्ति के लिए पढ़ना आसान
* किसी व्यक्ति के लिए पढ़ना आसान है
* समझने में आसान, और फलस्वरूप रखरखाव में भी आसान
* समझना आसान है, और परिणामस्वरूप बनाए रखना आसान है
* निश्चित गहराई: यदि और यदि कथनों का एक क्रम गहरी नेस्टिंग उत्पन्न कर सकता है, जिससे संकलन अधिक कठिन हो जाता है (विशेषकर स्वचालित रूप से उत्पन्न कोड में)
* निश्चित गहराई: "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...else if...else if" स्टेटमेंट्स के अनुक्रम में पहले और अंतिम के अलावा प्रत्येक स्थिति के लिए एक अतिरिक्त नोड होता है, साथ में संगत किनारा भी होता है। इस प्रकार "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> उदाहरण के लिए:
''स्विच एक्सप्रेशन'' 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) {
     case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31;
     case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31;
Line 106: Line 101:
};
};
</syntaxhighlight>
</syntaxhighlight>
== वैकल्पिक उपयोग ==
कई लैंगुएजेस रनटाइम के दौरान <code>switch</code> ब्लॉक के अंदर एक्सप्रेशनयों का मूल्यांकन करती हैं, जिससे निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति मिलती है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग लैंगुएजेस में अधिक साधारण है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड की तुलना में अधिक महत्वपूर्ण है।


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


== वैकल्पिक उपयोग ==
=== पीएचपी ===
कई भाषाएँ अंदर भावों का मूल्यांकन करती हैं <code>switch</code> रनटाइम पर ब्लॉक, निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति देता है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग भाषाओं में अधिक आम है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड से अधिक महत्वपूर्ण है।
उदाहरण के लिए, [[पीएचपी]] में, एक कोन्स्टेंट को "वेरिएबल" के रूप में उपयोग किया जा सकता है जिसके खिलाफ जाँच की जाएगी, और जिस पहले केस स्टेटमेंट का मूल्यांकन उस कोन्स्टेंट के लिए होता है उसे निष्पादित किया जाएगा:
 
=== [[पीएचपी]] ===
उदाहरण के लिए, PHP में, एक स्थिरांक को जांचने के लिए वेरिएबल के रूप में उपयोग किया जा सकता है, और उस स्थिरांक का मूल्यांकन करने वाला पहला केस स्टेटमेंट निष्पादित किया जाएगा:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
switch (true) {
switch (true) {
Line 125: Line 120:
}
}
</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 131:
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 143:
     normal
     normal
   end</syntaxhighlight>
   end</syntaxhighlight>
=== असेंबलर ===
=== असेंबलर ===
असेंबली भाषा में एक स्विच स्टेटमेंट:
असेंबली लैंगुएज में एक स्विच स्टेटमेंट:
<syntaxhighlight lang="nasm">
<syntaxhighlight lang="nasm">
switch:
switch:
Line 178: Line 171:
swtend:
swtend:
</syntaxhighlight>
</syntaxhighlight>
===पाइथन ===


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


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


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


* यदि-और [[सशर्त (प्रोग्रामिंग)]] की एक श्रृंखला जो एक समय में लक्ष्य एक मान की जांच करती है। फॉलथ्रू व्यवहार को अन्य खंड के बिना प्रत्येक सशर्त के अनुक्रम के साथ प्राप्त किया जा सकता है।
* ''if-else'' [[सशर्त (प्रोग्रामिंग)|सशर्त]] की एक श्रृंखला जो लक्ष्य की एक समय में मान की जांच करती है। फाल्थ्रू व्यवहार को ''else'' क्लॉज के बिना प्रत्येक सशर्त के अनुक्रम के साथ प्राप्त किया जा सकता है।
* एक लुकअप तालिका, जिसमें कुंजी के रूप में, शामिल है <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}}
*यदि आवश्यकता हो, तो एक कण्ट्रोल टेबल (जो एक साधारण लुकअप टेबल के रूप में कार्यान्वयन किया जा सकता है) भी एक से अधिक इनपुट पर एकाधिक स्थितियों को समायोजित करने के लिए अनुकूलित किया जा सकता है और सामन्यतः एक समान स्विच की तुलना में अधिक 'दृश्य संक्षेपता' दिखाता है (जो कई स्टेटमेंट को आवास कर सकता है)
* यदि आवश्यक हो तो एक नियंत्रण तालिका (जिसे एक साधारण लुकअप तालिका के रूप में कार्यान्वित किया जा सकता है) को कई इनपुट पर कई स्थितियों को समायोजित करने के लिए भी अनुकूलित किया जा सकता है और आमतौर पर समकक्ष स्विच (जो कई कथनों पर कब्जा कर सकता है) की तुलना में अधिक 'दृश्य कॉम्पैक्टनेस' प्रदर्शित करता है।
*[[पैटर्न मिलान]], जिसका उपयोग कई [[कार्यात्मक प्रोग्रामिंग|कार्यात्मक]] लैंगुएजेस में स्विच-जैसी कार्यक्षमता को कार्यान्वित करने के लिए किया जाता है।
* [[पैटर्न मिलान]], जिसका उपयोग कई [[कार्यात्मक प्रोग्रामिंग]] भाषाओं में स्विच जैसी कार्यक्षमता को लागू करने के लिए किया जाता है।


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


* [[एल्गोरिथम दक्षता]]
* [[एल्गोरिथम दक्षता]]
* शाखा तालिका
* ब्रांच टेबल
* नियंत्रण तालिका
* कण्ट्रोल टेबल
* डफ का उपकरण
*डफ की युक्ति
* [[ सूचकांक मानचित्रण ]]
* [[ सूचकांक मानचित्रण |इंडेक्स मैपिंग]]


== संदर्भ ==
== संदर्भ ==
Line 228: Line 216:
* [[Stephen Kleene]], 1952 (10th reprint 1991), ''Introduction to Metamathematics'', North-Holland Publishing Company, Amsterdam NL, {{ISBN|0-7204-2103-9}}
* [[Stephen Kleene]], 1952 (10th reprint 1991), ''Introduction to Metamathematics'', North-Holland Publishing Company, Amsterdam NL, {{ISBN|0-7204-2103-9}}
* [[George Boolos]], [[John P. Burgess|John Burgess]], and [[Richard Jeffrey]], 2002, ''Computability and Logic: Fourth Edition'', Cambridge University Press, Cambridge UK, {{ISBN|0-521-00758-5}} paperback. cf page 74-75.
* [[George Boolos]], [[John P. Burgess|John Burgess]], and [[Richard Jeffrey]], 2002, ''Computability and Logic: Fourth Edition'', Cambridge University Press, Cambridge UK, {{ISBN|0-521-00758-5}} paperback. cf page 74-75.
[[Category: सशर्त निर्माण]]


[[ru:Оператор ветвления#Переключатель (оператор множественного выбора)]]
[[ru:Оператор ветвления#Переключатель (оператор множественного выбора)]]


 
[[Category:All articles with unsourced statements]]
 
[[Category:Articles with unsourced statements from October 2011]]
[[Category: Machine Translated Page]]
[[Category:Created On 11/07/2023]]
[[Category:Created On 11/07/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:सशर्त निर्माण]]

Latest revision as of 12:28, 28 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


अग्रिम पठन