कथन बदलें (स्विच स्टेटमेंट): Difference between revisions
(minor changes) |
(Work done) |
||
Line 1: | Line 1: | ||
{{short description|Type of selection control mechanism in computer programming languages}} | {{short description|Type of selection control mechanism in computer programming languages}} | ||
[[कंप्यूटर प्रोग्रामिंग भाषा|कंप्यूटर प्रोग्रामिंग भाषाओं]] में, स्विच स्टेटमेंट एक प्रकार का | [[कंप्यूटर प्रोग्रामिंग भाषा|कंप्यूटर प्रोग्रामिंग भाषाओं]] में, '''स्विच स्टेटमेंट''' एक प्रकार का सलेक्शन कण्ट्रोल मैकेनिज्म है जिसका उपयोग सर्च और मैप के माध्यम से प्रोग्राम निष्पादन के कण्ट्रोल फ्लो को परिवर्तित करने के लिए किसी [[चर (प्रोग्रामिंग)|वेरिएबल]] या अभिव्यंजन के मान को अनुमति देने के लिए किया जाता है। | ||
स्विच स्टेटमेंट कुछ | स्विच स्टेटमेंट कुछ कुछ [[सी (प्रोग्रामिंग भाषा)|सी/]][[सी++]], सी#, विज़ुअल बेसिक .एनईटी, [[जावा (प्रोग्रामिंग भाषा)|जावा]] जैसी प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले <code>if</code> स्टेटमेंट के समान कार्य करते हैं और अधिकांश उच्च स्तरीय [[अनिवार्य प्रोग्रामिंग|अत्यावश्यक प्रोग्रामिंग]] भाषाओं जैसे [[पास्कल (प्रोग्रामिंग भाषा)|पास्कल]], [[एडा (प्रोग्रामिंग भाषा)|एडीए]], सी/सी++, सी#,<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}} विज़ुअल बेसिक .एनईटी, जावा,<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>जैसे [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)|कीवर्ड]] का उपयोग किया जाता है। | ||
स्विच स्टेटमेंट दो मुख्य | स्विच स्टेटमेंट दो मुख्य प्रकार के होते हैं: पास्कल जैसे स्ट्रक्चर्ड स्विच जो यथार्थतः एक ब्रांच प्राप्त करता है, और सी जैसे अनस्ट्रक्चर्ड स्विच जो एक तरह के [[ के लिए जाओ |गोटू]] के रूप में काम करता है। स्विच का उपयोग करने के मुख्य कारण में से एक यह है कि यह स्पष्टता को उत्कृष्ट बनाने में सहायता करता है, क्योंकि इससे पुनरावृत्तीय कोडिंग को कम किया जा सकता है, और (यदि ह्यूरिस्टिक्स अनुमति प्रदान करती है) बहुत से स्थितियों में सहज कंपाइलर अनुकूलन के माध्यम से तेज निष्पादन की संभावना भी प्रदान करता है। | ||
{| align="right" | {| align="right" | ||
|+''' | |+'''सी में स्विच स्टेटमेंट''' | ||
|<syntaxhighlight lang="c"> | |<syntaxhighlight lang="c"> | ||
switch (age) { | switch (age) { | ||
Line 21: | Line 20: | ||
== इतिहास == | == इतिहास == | ||
इसके 1952 के पाठ ''इंट्रोडक्शन टू मेटामैथेमेटिक्स'' में, [[स्टीफन क्लेन|स्टीफन क्लीन]] ने औपचारिक रूप से प्रमाणित कर दिया कि CASE फ़ंक्शन (IF-THEN-ELSE फ़ंक्शन इसका सबसे सरल रूप है) एक प्राथमिक पुनरावर्ती फंक्शन (प्रिमिटिव रिकर्सिव फंक्शन) है, जहां उन्होंने <code>definition by cases</code> की अवधारणा को निम्नलिखित तरीके से परिभाषित किया है: | |||
:"#F. | :"#F. फंक्शन φ इस प्रकार परिभाषित किया गया है | ||
:: φ(x<sub>1</sub> , ... , x<sub>n</sub> ) = | :: φ(x<sub>1</sub> , ... , x<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>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>(x<sub>1</sub> , ... , x<sub>n</sub> ) if Q<sub>m</sub>(x<sub>1</sub> , ... , x<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>(x<sub>1</sub> , ... , x<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 लौटाता है। | |||
बूलोस-बर्गेस-जेफरी ने अतिरिक्त अवलोकन किया कि " | बूलोस-बर्गेस-जेफरी ने अतिरिक्त अवलोकन किया कि "डेफिनिशन बाय केसेस" को साथ ही [[पारस्परिक विशिष्टता|म्युचली एक्सक्लूसिव]] और म्युचली एक्सहॉस्टिव होना आवश्यक है। वे भी इस फ़ंक्शन की प्रिमिटिव रिकर्सिवनेस्स का प्रमाण देते हैं (बूलोस-बर्गेस-जेफरी 2002:74-75)। | ||
IF-THEN-ELSE मैकार्थी | IF-THEN-ELSE मैकार्थी फोरमालिस्म का आधार है: इसका उपयोग प्रिमिटिव रिकर्सन और [[इन-ऑपरेटर|म्यू-ऑपरेटर]] दोनों को प्रतिस्थापित करता है। | ||
== विशिष्ट | == विशिष्ट सिंटेक्स == | ||
अधिकांश भाषाओं में, प्रोग्रामर एक या दो कीवर्ड का उपयोग करके कई | अधिकांश भाषाओं में, प्रोग्रामर एक या दो कीवर्ड का उपयोग करके कई एकाकी लाइनों में स्विच स्टेटमेंट लिखते हैं। एक सामान्य सिंटेक्स में सम्मिलित हैं: | ||
* | * सर्वप्रथम <code>select</code>, उसके बाद एक एक्सप्रेशन जिसे प्रायः स्विच स्टेटमेंट की ''कण्ट्रोल एक्सप्रेशन'' या ''कण्ट्रोल वेरिएबल'' के रूप में संदर्भित किया जाता है | ||
* वास्तविक | * वास्तविक स्थितियों (मूल्यों) को परिभाषित करने वाली बाद की पंक्तियाँ, मिलान होने पर निष्पादन के लिए बयानों के संगत अनुक्रम के साथ | ||
* फॉलथ्रू | * फॉलथ्रू बिहेवियर वाली भाषाओं में, <code>break</code> स्टेटमेंट सामान्यतः उक्त स्टेटमेंट को समाप्त करने के लिए <code>case</code> स्टेटमेंट का अनुसरण करता है। [वेल्स] | ||
* कुछ भाषाओं में, जैसे, पीएल/आई, | * कुछ भाषाओं में, जैसे, पीएल/आई, कण्ट्रोल एक्सप्रेशन वैकल्पिक है; यदि कोई कण्ट्रोल एक्सप्रेशन नहीं है, तो प्रत्येक विकल्प एक बूलियन एक्सप्रेशन वाले <CODE>WHEN</CODE> क्लॉज से शुरू होता है और पहले स्थिति के लिए एक मिलान होता है जिसके लिए वह एक्सप्रेशन सही मूल्यांकन करती है। यह उपयोग कुछ अन्य भाषाओं में if/then/elseif/else संरचनाओं के समान है, उदाहरण के लिए, [[पर्ल]]। | ||
* कुछ भाषाओं में, उदाहरण के लिए, [[Rexx]], किसी भी | * कुछ भाषाओं में, उदाहरण के लिए, [[Rexx]], किसी भी कण्ट्रोल एक्सप्रेशन की अनुमति नहीं है और प्रत्येक विकल्प एक बूलियन एक्सप्रेशन वाले <CODE>WHEN</CODE> क्लॉज से शुरू होता है और पहले स्थिति के लिए एक मिलान होता है जिसके लिए वह एक्सप्रेशन सत्य का मूल्यांकन करती है। | ||
प्रत्येक विकल्प विशेष मान, या मानों की सूची (नीचे देखें) से शुरू होता है, जिससे | प्रत्येक विकल्प विशेष मान, या मानों की सूची (नीचे देखें) से शुरू होता है, जिससे कण्ट्रोल चर मेल खा सकता है और जो कण्ट्रोल को स्टेटमेंट्स के संगत अनुक्रम में ले जाने का कारण बनेगा। मान (या मानों की सूची/श्रेणी) को सामान्यतः संबंधित स्टेटमेंट अनुक्रम से एक कोलन या एक निहितार्थ एरो द्वारा अलग किया जाता है। कई भाषाओं में, प्रत्येक केस के पहले कोई कीवर्ड भी होना चाहिए जैसे कि <code>case</code> या <code>when</code>। | ||
वैकल्पिक डिफ़ॉल्ट स्थिति की भी सामान्यतः अनुमति होती है, जो <code>default</code>, <code>otherwise</code>, या <code>else</code> कीवर्ड द्वारा निर्दिष्ट होता है। यह तब निष्पादित होता है जब कोई अन्य मामला कण्ट्रोल एक्सप्रेशन से मेल नहीं खाता है। कुछ भाषाओं में, जैसे कि सी, यदि कोई भी स्थिति समतुल्य नहीं होती है और <code>default</code> को छोड़ दिया जाता है तो <code>switch</code> स्टेटमेंट बस समाप्त हो जाता है। अन्य में, जैसे पीएल/आई में, एक त्रुटि उत्पन्न होती है। | |||
== शब्दार्थ == | == शब्दार्थ == | ||
शब्दार्थ की दृष्टि से, स्विच | शब्दार्थ की दृष्टि से, स्विच स्टेटमेंट के दो मुख्य रूप हैं। | ||
सर्वप्रथम रूप स्ट्रक्चर्ड स्विच है, जैसे पास्कल में, जहां यथार्थतः एक ब्रांच प्राप्त करता है, और स्थितियों को अलग, विशिष्ट ब्लॉक के रूप में माना जाता है। यह एक सामान्यीकृत if–then–else [[सशर्त (कंप्यूटर प्रोग्रामिंग)|सशर्त]] के रूप में कार्य करता है, यहाँ केवल दो नहीं बल्कि किसी भी संख्या में ब्रांचएँ होती हैं। | |||
दूसरा रूप | दूसरा रूप अनस्ट्रक्चर्ड स्विच है, जैसा कि सी में है, जहां स्थितियों को एक ही ब्लॉक के भीतर लेबल के रूप में माना जाता है, और स्विच एक सामान्यीकृत गोटो के रूप में कार्य करता है। इस भेद को फॉलथ्रू के उपचार के रूप में जाना जाता है, जिसे नीचे विस्तार से बताया गया है। | ||
=== फाल्थ्रू === | === फाल्थ्रू === | ||
कई भाषाओं में, केवल | कई भाषाओं में, केवल समतुल्य ब्लॉक को निष्पादित किया जाता है, और फिर स्विच स्टेटमेंट के अंत में निष्पादन सतत रहता है। इनमें पास्कल वर्ग (ऑब्जेक्ट पास्कल, मोडुला, ओबेरॉन, एडा, आदि) के साथ-साथ पीएल/आई, [[फोरट्रान]] के आधुनिक रूप और पास्कल से प्रभावित [[ बुनियादी |बेसिक]] बोलियाँ, अधिकांश कार्यात्मक भाषाएँ और कई अन्य सम्मिलित हैं। एक ही कोड को निष्पादित करने के लिए कई मानों की अनुमति देने के लिए (और [[डुप्लिकेट कोड]] करने की आवश्यकता से बचने के लिए), पास्कल-प्रकार की भाषाएं प्रति स्थिति में किसी भी संख्या में मानों की अनुमति देती हैं, जो अल्पविराम से अलग की गई सूची के रूप में, एक श्रेणी के रूप में या एक संयोजन के रूप में दी जाती हैं। | ||
सी भाषा से | सी भाषा से प्रगत भाषाएँ और अधिक सामान्य रूप से फोरट्रान के गणना की गई जीओटीओ से प्रभावित भाषाएँ, फॉलथ्रू का प्रदर्शन करती हैं। इसमें कण्ट्रोल मिलता है जो मिलाने वाले केस में जाता है, और फिर निष्पादन सोर्स पाठ में ''अगले केस'' के साथ जारी रखता है ("फॉलथ्रू" होता है)। फॉलथ्रू के द्वारा, एक ही बिंदु के साथ कई मान पूर्णतः कोई विशेष विधि के बिना मिल सकते हैं: वे बस एम्प्टी बॉडी के साथ सूचीबद्ध होते हैं। मानों को मामले के शरीर में कोड से विशेष शर्ताधारी किया जा सकता है। व्यावहारिक रूप से, फॉलथ्रू साधारण तौर पर मिलाने वाले शरीर के अंत में एक ब्रेक कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन को बंद कर देता है, लेकिन अगर प्रोग्रामर भूल जाता है तो यह अचानकी फॉलथ्रू के कारण बग्स का कारण बन सकता है। केस बॉडी में कोड के साथ मूल्यों को विशेष रूप से अनुकूलित किया जा सकता है। व्यवहार में, फॉलथ्रू को सामान्यतः मिलान निकाय के अंत में एक <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> स्टेटमेंट स्पष्ट रूप से कण्ट्रोल प्रवाह को बदलते हैं। सी से प्रभावित कुछ भाषाएं, जैसे कि [[जावास्क्रिप्ट|जावाScript]], डिफॉल्ट फॉलथ्रू को बनाए रखती हैं, जबकि अन्य फॉलथ्रू को हटा देती हैं, या केवल विशेष परिस्थितियों में ही इसकी अनुमति देती हैं। सी-वर्ग में इस पर उल्लेखनीय विविधताओं में सी# सम्मिलित है, जिसमें सभी ब्लॉकों को <code>break</code> या <code>return</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> की अनुमति देता है। | ||
स्विच स्टेटमेंट का एक उदाहरण जो फ़ॉलथ्रू पर निर्भर करता है वह डफ़ का उपकरण है। | स्विच स्टेटमेंट का एक उदाहरण जो फ़ॉलथ्रू पर निर्भर करता है वह डफ़ का उपकरण है। | ||
Line 69: | Line 68: | ||
== संकलन == | == संकलन == | ||
[[अनुकूलन (कंप्यूटर विज्ञान)|ऑप्टिमाइजिंग कंपाइलर]] जैसे [[जीएनयू कंपाइलर संग्रह| | [[अनुकूलन (कंप्यूटर विज्ञान)|ऑप्टिमाइजिंग कंपाइलर]] जैसे [[जीएनयू कंपाइलर संग्रह|जीसीसी]] या [[बजना|क्लैंग]] स्विच स्टेटमेंट को या तो एक [[शाखा तालिका|ब्रांच टेबल]] में या फिर केसेस में विद्यमान मानों के माध्यम से एक [[बाइनरी खोज एल्गोरिदम|बाइनरी सर्च]] के रूप में कंपाइल कर सकते हैं।<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> स्टेटमेंट का उपयोग if else if स्टेटमेंट की समकक्ष श्रृंखला से बेहतर माना जाता है क्योंकि यह है: | कुछ भाषाओं और प्रोग्रामिंग वातावरणों में, <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> उदाहरण के लिए, एकल वर्ण के मान के आधार पर प्रोग्राम प्रवाह तय करना, यदि सही ढंग से लागू किया जाता है, तो विकल्प की तुलना में काफी अधिक कुशल है, जिससे [[निर्देश पथ की लंबाई]] काफी कम हो जाती है। जब इसे इस प्रकार लागू किया जाता है, तो एक स्विच स्टेटमेंट अनिवार्य रूप से एक आदर्श हैश बन जाता है। | ||
[[नियंत्रण-प्रवाह ग्राफ]] के संदर्भ में, एक स्विच स्टेटमेंट में दो नोड्स (प्रवेश और निकास) होते हैं, साथ ही प्रत्येक विकल्प के लिए उनके बीच एक किनारा होता है। इसके विपरीत, " | [[नियंत्रण-प्रवाह ग्राफ|कण्ट्रोल-प्रवाह ग्राफ]] के संदर्भ में, एक स्विच स्टेटमेंट में दो नोड्स (प्रवेश और निकास) होते हैं, साथ ही प्रत्येक विकल्प के लिए उनके बीच एक किनारा होता है। इसके विपरीत, "if...else if...else if" स्टेटमेंट्स के अनुक्रम में पहले और अंतिम के अलावा प्रत्येक स्थिति के लिए एक अतिरिक्त नोड होता है, साथ में संगत किनारा भी होता है। इस प्रकार "if" के अनुक्रमों के लिए परिणामी कण्ट्रोल-प्रवाह ग्राफ़ में कई अधिक नोड्स और लगभग दोगुने किनारे होते हैं, इनमें कोई उपयोगी जानकारी नहीं जोड़ी जाती है। हालाँकि, if स्टेटमेंट्स में सरल ब्रांचएँ स्विच स्टेटमेंट की जटिल ब्रांच की तुलना में व्यक्तिगत रूप से वैचारिक रूप से आसान होती हैं। चक्रीय जटिलता के संदर्भ में, यदि k स्थिति दिए जाएं तो ये दोनों विकल्प इसे ''k''-1 तक बढ़ा देते हैं। | ||
== | == एक्सप्रेशन स्विच करें == | ||
स्विच एक्सप्रेशन जावा एसई 12, 19 मार्च 2019 में एक पूर्वावलोकन सुविधा के रूप में | ''स्विच एक्सप्रेशन'' जावा एसई 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) { | ||
Line 103: | Line 102: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== वैकल्पिक उपयोग == | == वैकल्पिक उपयोग == | ||
कई भाषाएँ रनटाइम के दौरान <code>switch</code> ब्लॉक के अंदर | कई भाषाएँ रनटाइम के दौरान <code>switch</code> ब्लॉक के अंदर एक्सप्रेशनयों का मूल्यांकन करती हैं, जिससे निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति मिलती है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग भाषाओं में अधिक साधारण है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड की तुलना में अधिक महत्वपूर्ण है। | ||
कई भाषाएँ अंदर भावों का मूल्यांकन करती हैं रनटाइम पर ब्लॉक, निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति देता है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग भाषाओं में अधिक | कई भाषाएँ अंदर भावों का मूल्यांकन करती हैं रनटाइम पर ब्लॉक, निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति देता है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग भाषाओं में अधिक साधारण है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड से अधिक महत्वपूर्ण है। | ||
=== | === पीएचपी === | ||
उदाहरण के लिए, [[पीएचपी | उदाहरण के लिए, [[पीएचपी]] में, एक कोन्स्टेंट को "वेरिएबल" के रूप में उपयोग किया जा सकता है जिसके खिलाफ जाँच की जाएगी, और जिस पहले केस स्टेटमेंट का मूल्यांकन उस कोन्स्टेंट के लिए होता है उसे निष्पादित किया जाएगा: | ||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
switch (true) { | switch (true) { | ||
Line 121: | Line 120: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
यह सुविधा कई मानों के विरुद्ध एक चर की तुलना में एक मान के विरुद्ध अनेक चरों की जाँच करने के लिए भी उपयोगी है। COBOL <code>EVALUATE</code> स्टेटमेंट में इस फॉर्म (और अन्य फॉर्म) का भी समर्थन करता है। पीएल/आई के पास <code>SELECT</code> स्टेटमेंट का एक वैकल्पिक रूप है जहां | यह सुविधा कई मानों के विरुद्ध एक चर की तुलना में एक मान के विरुद्ध अनेक चरों की जाँच करने के लिए भी उपयोगी है। COBOL <code>EVALUATE</code> स्टेटमेंट में इस फॉर्म (और अन्य फॉर्म) का भी समर्थन करता है। पीएल/आई के पास <code>SELECT</code> स्टेटमेंट का एक वैकल्पिक रूप है जहां कण्ट्रोल एक्सप्रेशन पूरी तरह से छोड़ दी जाती है और सत्य का मूल्यांकन करने वाला सर्वप्रथम <code>WHEN</code> निष्पादित किया जाता है। | ||
=== रूबी === | === रूबी === | ||
[[रूबी (प्रोग्रामिंग भाषा)|रूबी]] में, <code>===</code> समानता से निपटने के कारण, | [[रूबी (प्रोग्रामिंग भाषा)|रूबी]] में, <code>===</code> समानता से निपटने के कारण, स्टेटमेंट का उपयोग चर की कक्षा के परीक्षण के लिए किया जा सकता है: | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
Line 172: | 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> अन्य भाषाओं के विपरीत, पाइथन विशेष रूप से पतनशील व्यवहार प्रदर्शित नहीं करता है। | |||
<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 187: | 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> एक स्थिति को परिभाषित करता है। यह [[डेल्फ़ी (प्रोग्रामिंग भाषा)|डेल्फ़ी]], [[स्काला (प्रोग्रामिंग भाषा)|स्कैला]] और विज़ुअल बेसिक .एनईटी में भी पाया जाता है। | ||
== विकल्प == | == विकल्प == | ||
स्टेटमेंट्स को बदलने के कुछ विकल्प हो सकते हैं: | |||
* | * ''if-else'' [[सशर्त (प्रोग्रामिंग)|सशर्त]] की एक श्रृंखला जो लक्ष्य की एक समय में मान की जांच करती है। फाल्थ्रू व्यवहार को ''else'' क्लॉज के बिना प्रत्येक सशर्त के अनुक्रम के साथ प्राप्त किया जा सकता है। | ||
* एक लुकअप टेबल, जिसमें कुंजियों के रूप में, <code>case</code> मान और, मान के रूप में, <code>case</code> स्टेटमेंट के अंतर्गत भाग | * एक लुकअप टेबल, जिसमें कुंजियों के रूप में, <code>case</code> मान और, मान के रूप में, <code>case</code> स्टेटमेंट के अंतर्गत भाग सम्मिलित होता है। | ||
::(कुछ भाषाओं में, केवल वास्तविक डेटा प्रकारों को लुकअप तालिका में मान के रूप में अनुमति दी जाती है। अन्य भाषाओं में, वास्तविक <code>switch</code> स्टेटमेंट के समान लचीलापन प्राप्त करते हुए, लुकअप तालिका मान के रूप में फ़ंक्शन निर्दिष्ट करना भी संभव है। अधिक के लिए [[नियंत्रण तालिका]] आलेख देखें इस पर विस्तार से)। | ::(कुछ भाषाओं में, केवल वास्तविक डेटा प्रकारों को लुकअप तालिका में मान के रूप में अनुमति दी जाती है। अन्य भाषाओं में, वास्तविक <code>switch</code> स्टेटमेंट के समान लचीलापन प्राप्त करते हुए, लुकअप तालिका मान के रूप में फ़ंक्शन निर्दिष्ट करना भी संभव है। अधिक के लिए [[नियंत्रण तालिका|कण्ट्रोल तालिका]] आलेख देखें इस पर विस्तार से)। | ||
[[लुआ (प्रोग्रामिंग भाषा)|लुआ]] केस/स्विच स्टेटमेंट का समर्थन नहीं करता है।<ref name="lua">[http://lua-users.org/wiki/SwitchStatement Switch statement in Lua]</ref> यह लुकअप तकनीक लुआ भाषा में <code>switch</code> स्टेटमेंट को लागू करने का एक तरीका है, जिसमें कोई अंतर्निहित <code>switch</code>नहीं है।<ref name="lua" /> कुछ | [[लुआ (प्रोग्रामिंग भाषा)|लुआ]] केस/स्विच स्टेटमेंट का समर्थन नहीं करता है।<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}} | ||
*यदि | *यदि आवश्यकता हो, तो एक कण्ट्रोल टेबल (जो एक साधारण लुकअप टेबल के रूप में कार्यान्वयन किया जा सकता है) भी एक से अधिक इनपुट पर एकाधिक स्थितियों को समायोजित करने के लिए अनुकूलित किया जा सकता है और सामन्यतः एक समान स्विच की तुलना में अधिक 'दृश्य संक्षेपता' दिखाता है (जो कई स्टेटमेंट को आवास कर सकता है)। | ||
*[[पैटर्न मिलान]], जिसका उपयोग कई [[कार्यात्मक प्रोग्रामिंग|कार्यात्मक]] भाषाओं में स्विच-जैसी कार्यक्षमता को कार्यान्वित करने के लिए किया जाता है। | *[[पैटर्न मिलान]], जिसका उपयोग कई [[कार्यात्मक प्रोग्रामिंग|कार्यात्मक]] भाषाओं में स्विच-जैसी कार्यक्षमता को कार्यान्वित करने के लिए किया जाता है। | ||
Line 205: | Line 202: | ||
* [[एल्गोरिथम दक्षता]] | * [[एल्गोरिथम दक्षता]] | ||
* | * ब्रांच टेबल | ||
* | * कण्ट्रोल टेबल | ||
* डफ | *डफ की युक्ति | ||
* [[ सूचकांक मानचित्रण ]] | * [[ सूचकांक मानचित्रण |इंडेक्स मैपिंग]] | ||
== संदर्भ == | == संदर्भ == |
Revision as of 12:39, 21 July 2023
कंप्यूटर प्रोग्रामिंग भाषाओं में, स्विच स्टेटमेंट एक प्रकार का सलेक्शन कण्ट्रोल मैकेनिज्म है जिसका उपयोग सर्च और मैप के माध्यम से प्रोग्राम निष्पादन के कण्ट्रोल फ्लो को परिवर्तित करने के लिए किसी वेरिएबल या अभिव्यंजन के मान को अनुमति देने के लिए किया जाता है।
स्विच स्टेटमेंट कुछ कुछ सी/सी++, सी#, विज़ुअल बेसिक .एनईटी, जावा जैसी प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले if
स्टेटमेंट के समान कार्य करते हैं और अधिकांश उच्च स्तरीय अत्यावश्यक प्रोग्रामिंग भाषाओं जैसे पास्कल, एडीए, सी/सी++, सी#,[1]: 157–167 विज़ुअल बेसिक .एनईटी, जावा,[2] : 157–167 और कई अन्य प्रकार की भाषा में विद्यमान हैं, जिनमें switch
, case
, select
या inspect
जैसे कीवर्ड का उपयोग किया जाता है।
स्विच स्टेटमेंट दो मुख्य प्रकार के होते हैं: पास्कल जैसे स्ट्रक्चर्ड स्विच जो यथार्थतः एक ब्रांच प्राप्त करता है, और सी जैसे अनस्ट्रक्चर्ड स्विच जो एक तरह के गोटू के रूप में काम करता है। स्विच का उपयोग करने के मुख्य कारण में से एक यह है कि यह स्पष्टता को उत्कृष्ट बनाने में सहायता करता है, क्योंकि इससे पुनरावृत्तीय कोडिंग को कम किया जा सकता है, और (यदि ह्यूरिस्टिक्स अनुमति प्रदान करती है) बहुत से स्थितियों में सहज कंपाइलर अनुकूलन के माध्यम से तेज निष्पादन की संभावना भी प्रदान करता है।
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]
- φ(x1 , ... , xn ) =
क्लीन बूलियन-जैसे रिकर्सिव फंक्शन "साइन-ऑफ़" 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
स्टेटमेंट बस समाप्त हो जाता है। अन्य में, जैसे पीएल/आई में, एक त्रुटि उत्पन्न होती है।
शब्दार्थ
शब्दार्थ की दृष्टि से, स्विच स्टेटमेंट के दो मुख्य रूप हैं।
सर्वप्रथम रूप स्ट्रक्चर्ड स्विच है, जैसे पास्कल में, जहां यथार्थतः एक ब्रांच प्राप्त करता है, और स्थितियों को अलग, विशिष्ट ब्लॉक के रूप में माना जाता है। यह एक सामान्यीकृत if–then–else सशर्त के रूप में कार्य करता है, यहाँ केवल दो नहीं बल्कि किसी भी संख्या में ब्रांचएँ होती हैं।
दूसरा रूप अनस्ट्रक्चर्ड स्विच है, जैसा कि सी में है, जहां स्थितियों को एक ही ब्लॉक के भीतर लेबल के रूप में माना जाता है, और स्विच एक सामान्यीकृत गोटो के रूप में कार्य करता है। इस भेद को फॉलथ्रू के उपचार के रूप में जाना जाता है, जिसे नीचे विस्तार से बताया गया है।
फाल्थ्रू
कई भाषाओं में, केवल समतुल्य ब्लॉक को निष्पादित किया जाता है, और फिर स्विच स्टेटमेंट के अंत में निष्पादन सतत रहता है। इनमें पास्कल वर्ग (ऑब्जेक्ट पास्कल, मोडुला, ओबेरॉन, एडा, आदि) के साथ-साथ पीएल/आई, फोरट्रान के आधुनिक रूप और पास्कल से प्रभावित बेसिक बोलियाँ, अधिकांश कार्यात्मक भाषाएँ और कई अन्य सम्मिलित हैं। एक ही कोड को निष्पादित करने के लिए कई मानों की अनुमति देने के लिए (और डुप्लिकेट कोड करने की आवश्यकता से बचने के लिए), पास्कल-प्रकार की भाषाएं प्रति स्थिति में किसी भी संख्या में मानों की अनुमति देती हैं, जो अल्पविराम से अलग की गई सूची के रूप में, एक श्रेणी के रूप में या एक संयोजन के रूप में दी जाती हैं।
सी भाषा से प्रगत भाषाएँ और अधिक सामान्य रूप से फोरट्रान के गणना की गई जीओटीओ से प्रभावित भाषाएँ, फॉलथ्रू का प्रदर्शन करती हैं। इसमें कण्ट्रोल मिलता है जो मिलाने वाले केस में जाता है, और फिर निष्पादन सोर्स पाठ में अगले केस के साथ जारी रखता है ("फॉलथ्रू" होता है)। फॉलथ्रू के द्वारा, एक ही बिंदु के साथ कई मान पूर्णतः कोई विशेष विधि के बिना मिल सकते हैं: वे बस एम्प्टी बॉडी के साथ सूचीबद्ध होते हैं। मानों को मामले के शरीर में कोड से विशेष शर्ताधारी किया जा सकता है। व्यावहारिक रूप से, फॉलथ्रू साधारण तौर पर मिलाने वाले शरीर के अंत में एक ब्रेक कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन को बंद कर देता है, लेकिन अगर प्रोग्रामर भूल जाता है तो यह अचानकी फॉलथ्रू के कारण बग्स का कारण बन सकता है। केस बॉडी में कोड के साथ मूल्यों को विशेष रूप से अनुकूलित किया जा सकता है। व्यवहार में, फॉलथ्रू को सामान्यतः मिलान निकाय के अंत में एक break
कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन से बाहर निकलता है, लेकिन यदि प्रोग्रामर break
स्टेटमेंट डालना भूल जाता है तो यह अनजाने में फॉलथ्रू के कारण बग उत्पन्न कर सकता है। इस प्रकार इसे कई लोगों द्वारा[4] भाषा के मस्से के रूप में देखा जाता है, और कुछ लिंट टूल्स में इसके प्रति चेतावनी दी जाती है। वाक्यात्मक रूप से, स्थितियों को लेबल के रूप में समझा जाता है, ब्लॉक के रूप में नहीं, और स्विच और break
स्टेटमेंट स्पष्ट रूप से कण्ट्रोल प्रवाह को बदलते हैं। सी से प्रभावित कुछ भाषाएं, जैसे कि जावाScript, डिफॉल्ट फॉलथ्रू को बनाए रखती हैं, जबकि अन्य फॉलथ्रू को हटा देती हैं, या केवल विशेष परिस्थितियों में ही इसकी अनुमति देती हैं। सी-वर्ग में इस पर उल्लेखनीय विविधताओं में सी# सम्मिलित है, जिसमें सभी ब्लॉकों को break
या return
के साथ समाप्त किया जाना चाहिए जब तक कि ब्लॉक खाली न हो (अर्थात फॉलथ्रू का उपयोग कई मान निर्दिष्ट करने के तरीके के रूप में किया जाता है)।
कुछ स्थितियों में भाषाएँ वैकल्पिक फॉलथ्रू प्रदान करती हैं। उदाहरण के लिए, पर्ल डिफ़ॉल्ट रूप से विफल नहीं होता है, लेकिन एक केस continue
कीवर्ड का उपयोग करके स्पष्ट रूप से ऐसा कर सकता है। यह अनजाने में गिरने से रोकता है लेकिन जब चाहे तब इसकी अनुमति देता है। इसी प्रकार, बैश डिफ़ॉल्ट रूप से ;;
के साथ समाप्त होने पर फ़ॉलथ्रू नहीं करता है, लेकिन इसके बजाय ;&
या ;;&
के साथ फॉलथ्रू[5] की अनुमति देता है।
स्विच स्टेटमेंट का एक उदाहरण जो फ़ॉलथ्रू पर निर्भर करता है वह डफ़ का उपकरण है।
संकलन
ऑप्टिमाइजिंग कंपाइलर जैसे जीसीसी या क्लैंग स्विच स्टेटमेंट को या तो एक ब्रांच टेबल में या फिर केसेस में विद्यमान मानों के माध्यम से एक बाइनरी सर्च के रूप में कंपाइल कर सकते हैं।[6] एक ब्रांच टेबल को स्विच स्टेटमेंट को एक छोटे, स्थिर संख्यक निर्देशिका के रूप में कार्यान्वयन करने देता है जिससे कंपेयर को तुलनाओं की सूची से बिना जाना के विभाजन करने के लिए निर्देशिका में से निर्दिष्ट ब्रांच का निष्पादन करने में सक्षम होता है, जबकि बाइनरी सर्च में केवल लॉगारिदमिक संख्या की तुलना में कम्पेयरिजन होती है, जो स्विच स्टेटमेंट में केसेस की संख्या मापता है।
सामान्यतः, यह पता लगाने का एकमात्र तरीका कि यह अनुकूलन हुआ है या नहीं, वास्तव में कंपाइलर द्वारा उत्पन्न परिणामी असेंबली या मशीन कोड आउटपुट को देखना है।
लाभ और हानि
This section does not cite any sources. (January 2017) (Learn how and when to remove this template message) |
कुछ भाषाओं और प्रोग्रामिंग वातावरणों में, case
या switch
स्टेटमेंट का उपयोग if else if स्टेटमेंट की समकक्ष श्रृंखला से बेहतर माना जाता है क्योंकि यह है:
- डिबग करना आसान है (उदाहरण के लिए कोड बनाम कॉल टेबल पर ब्रेकपॉइंट सेट करना, यदि डिबगर में कोई सशर्त ब्रेकपॉइंट क्षमता नहीं है)
- किसी व्यक्ति के लिए पढ़ना आसान है
- समझना आसान है, और परिणामस्वरूप बनाए रखना आसान है
- निश्चित गहराई: "if else if" स्टेटमेंट्स का एक क्रम गहरी नेस्टिंग उत्पन्न कर सकता है, जिससे संकलन अधिक कठिन हो जाता है (विशेषकर स्वचालित रूप से उत्पन्न कोड में)
- यह सत्यापित करना आसान है कि सभी मान संभाले गए हैं। कंपाइलर्स यदि कुछ एनम मानों को संभाला न जाए तो चेतावनी जारी कर सकते हैं।
इसके अतिरिक्त, एक अनुकूलित कार्यान्वयन विकल्प की तुलना में बहुत तेजी से निष्पादित हो सकता है, क्योंकि इसे प्रायः अनुक्रमित ब्रांच तालिका का उपयोग करके कार्यान्वित किया जाता है।[7] उदाहरण के लिए, एकल वर्ण के मान के आधार पर प्रोग्राम प्रवाह तय करना, यदि सही ढंग से लागू किया जाता है, तो विकल्प की तुलना में काफी अधिक कुशल है, जिससे निर्देश पथ की लंबाई काफी कम हो जाती है। जब इसे इस प्रकार लागू किया जाता है, तो एक स्विच स्टेटमेंट अनिवार्य रूप से एक आदर्श हैश बन जाता है।
कण्ट्रोल-प्रवाह ग्राफ के संदर्भ में, एक स्विच स्टेटमेंट में दो नोड्स (प्रवेश और निकास) होते हैं, साथ ही प्रत्येक विकल्प के लिए उनके बीच एक किनारा होता है। इसके विपरीत, "if...else if...else if" स्टेटमेंट्स के अनुक्रम में पहले और अंतिम के अलावा प्रत्येक स्थिति के लिए एक अतिरिक्त नोड होता है, साथ में संगत किनारा भी होता है। इस प्रकार "if" के अनुक्रमों के लिए परिणामी कण्ट्रोल-प्रवाह ग्राफ़ में कई अधिक नोड्स और लगभग दोगुने किनारे होते हैं, इनमें कोई उपयोगी जानकारी नहीं जोड़ी जाती है। हालाँकि, if स्टेटमेंट्स में सरल ब्रांचएँ स्विच स्टेटमेंट की जटिल ब्रांच की तुलना में व्यक्तिगत रूप से वैचारिक रूप से आसान होती हैं। चक्रीय जटिलता के संदर्भ में, यदि k स्थिति दिए जाएं तो ये दोनों विकल्प इसे k-1 तक बढ़ा देते हैं।
एक्सप्रेशन स्विच करें
स्विच एक्सप्रेशन जावा एसई 12, 19 मार्च 2019 में एक पूर्वावलोकन सुविधा के रूप में प्रस्तुत किए गए हैं। यहां मान वापस करने के लिए संपूर्ण स्विच एक्सप्रेशन का उपयोग किया जा सकता है। केस लेबल का एक नया रूप भी है, case L->
जहां दाईं ओर एक एकल एक्सप्रेशन है। हालाँकि, यह फॉलथ्रू को भी रोकता है और इसके लिए आवश्यक है कि स्थिति विस्तृत हों। जावा एसई 13 में yield
स्टेटमेंट प्रस्तुत किया गया है, और जावा एसई 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
एक स्थिति को परिभाषित करता है। यह डेल्फ़ी, स्कैला और विज़ुअल बेसिक .एनईटी में भी पाया जाता है।
विकल्प
स्टेटमेंट्स को बदलने के कुछ विकल्प हो सकते हैं:
- if-else सशर्त की एक श्रृंखला जो लक्ष्य की एक समय में मान की जांच करती है। फाल्थ्रू व्यवहार को else क्लॉज के बिना प्रत्येक सशर्त के अनुक्रम के साथ प्राप्त किया जा सकता है।
- एक लुकअप टेबल, जिसमें कुंजियों के रूप में,
case
मान और, मान के रूप में,case
स्टेटमेंट के अंतर्गत भाग सम्मिलित होता है।
- (कुछ भाषाओं में, केवल वास्तविक डेटा प्रकारों को लुकअप तालिका में मान के रूप में अनुमति दी जाती है। अन्य भाषाओं में, वास्तविक
switch
स्टेटमेंट के समान लचीलापन प्राप्त करते हुए, लुकअप तालिका मान के रूप में फ़ंक्शन निर्दिष्ट करना भी संभव है। अधिक के लिए कण्ट्रोल तालिका आलेख देखें इस पर विस्तार से)।
- (कुछ भाषाओं में, केवल वास्तविक डेटा प्रकारों को लुकअप तालिका में मान के रूप में अनुमति दी जाती है। अन्य भाषाओं में, वास्तविक
लुआ केस/स्विच स्टेटमेंट का समर्थन नहीं करता है।[15] यह लुकअप तकनीक लुआ भाषा में switch
स्टेटमेंट को लागू करने का एक तरीका है, जिसमें कोई अंतर्निहित switch
नहीं है।[15] कुछ स्थितियों में, लुकअप टेबल गैर-अनुकूलित switch
स्टेटमेंट की तुलना में अधिक कुशल होते हैं क्योंकि कई भाषाएं टेबल लुकअप को अनुकूलित कर सकती हैं, जबकि स्विच स्टेटमेंट को तब तक अनुकूलित नहीं किया जाता है जब तक कि मानों की सीमा कुछ अंतराल के साथ छोटी न हो। हालाँकि, एक गैर-अनुकूलित, गैर-बाइनरी खोज लुकअप लगभग निश्चित रूप से एक गैर-अनुकूलित स्विच या समकक्ष एकाधिक यदि-अन्यथा स्टेटमेंट्स की तुलना में धीमा होगा।[citation needed]
- यदि आवश्यकता हो, तो एक कण्ट्रोल टेबल (जो एक साधारण लुकअप टेबल के रूप में कार्यान्वयन किया जा सकता है) भी एक से अधिक इनपुट पर एकाधिक स्थितियों को समायोजित करने के लिए अनुकूलित किया जा सकता है और सामन्यतः एक समान स्विच की तुलना में अधिक 'दृश्य संक्षेपता' दिखाता है (जो कई स्टेटमेंट को आवास कर सकता है)।
- पैटर्न मिलान, जिसका उपयोग कई कार्यात्मक भाषाओं में स्विच-जैसी कार्यक्षमता को कार्यान्वित करने के लिए किया जाता है।
यह भी देखें
- एल्गोरिथम दक्षता
- ब्रांच टेबल
- कण्ट्रोल टेबल
- डफ की युक्ति
- इंडेक्स मैपिंग
संदर्भ
- ↑ Bloch, Joshua (2018). "Effective Java: Programming Language Guide" (third ed.). Addison-Wesley. ISBN 978-0134685991.
- ↑ Bloch, Joshua (2018). "Effective Java: Programming Language Guide" (third ed.). Addison-Wesley. ISBN 978-0134685991.
- ↑ "Definition by cases", Kleene 1952:229
- ↑ van der Linden, Peter (1994). Expert C Programming: Deep C Secrets, p. 38. Prentice Hall, Eaglewood Cliffs. ISBN 0131774298.
- ↑ since version 4.0, released in 2009.
- ↑ Vlad Lazarenko. From Switch Statement Down to Machine Code
- ↑ Guntheroth, Kurt (April 27, 2016). अनुकूलित सी++. O'Reilly Media. p. 182. ISBN 9781491922033.
- ↑ "JEP 325: Switch Expressions (Preview)". openjdk.java.net. Retrieved 2021-04-28.
- ↑ "JEP 354: Switch Expressions (Second Preview)". openjdk.java.net. Retrieved 2021-04-28.
- ↑ "JEP 361: Switch Expressions". openjdk.java.net. Retrieved 2021-04-28.
- ↑ Galindo Salgado, Pablo. "What's New In Python 3.10". Python 3.10.6 documentation. Retrieved 2022-08-19.
- ↑ Bucher, Brandt; van Rossum, Guido (2020-09-12). "PEP 634 – Structural Pattern Matching: Specification". Python Enhancement Proposals. Retrieved 2022-08-19.
- ↑ Kohn, Tobias; van Rossum, Guido (2020-09-12). "PEP 635 – Structural Pattern Matching: Motivation and Rationale". Python Enhancement Proposals. Retrieved 2022-08-19.
- ↑ Moisset, Daniel F. "PEP 636 – Structural Pattern Matching: Tutorial". Python Enhancement Proposals. Retrieved 2022-08-19.
- ↑ 15.0 15.1 Switch statement in Lua
अग्रिम पठन
- Stephen Kleene, 1952 (10th reprint 1991), Introduction to Metamathematics, North-Holland Publishing Company, Amsterdam NL, ISBN 0-7204-2103-9
- George Boolos, 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.