कथन बदलें (स्विच स्टेटमेंट): Difference between revisions
(Created page with "{{refimprove|date=April 2013}} {{short description|Type of selection control mechanism in computer programming languages}} कंप्यूटर प्रोग्रा...") |
(minor changes) |
||
Line 1: | Line 1: | ||
{{refimprove|date=April 2013}} | {{refimprove|date=April 2013}} | ||
{{short description|Type of selection control mechanism in computer programming languages}} | {{short description|Type of selection control mechanism in computer programming languages}} | ||
[[कंप्यूटर प्रोग्रामिंग भाषा]] | [[कंप्यूटर प्रोग्रामिंग भाषा|कंप्यूटर प्रोग्रामिंग भाषाओं]] में, स्विच स्टेटमेंट एक प्रकार का चयन नियंत्रण तंत्र है जिसका उपयोग एक [[चर (प्रोग्रामिंग)|चर]] या व्यक्ति व्यक्ति के मान को परिवर्तित करने के लिए किया जाता है ताकि कार्यक्रम के नियंत्रण विकल्प को खोजने और मैप करने के माध्यम से कार्यक्रम का निष्पादन बदल सके। | ||
स्विच स्टेटमेंट कुछ हद तक | स्विच स्टेटमेंट कुछ हद तक [[सी (प्रोग्रामिंग भाषा)|C/]][[सी++|C++]], C#, विज़ुअल बेसिक .NET, [[जावा (प्रोग्रामिंग भाषा)|Java]] जैसी प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले <code>if</code> स्टेटमेंट के समान कार्य करते हैं और अधिकांश उच्च स्तरीय [[अनिवार्य प्रोग्रामिंग]] भाषाओं जैसे [[पास्कल (प्रोग्रामिंग भाषा)|पास्कल]], [[एडा (प्रोग्रामिंग भाषा)|Ada]], C/C++, C#,<ref name="Bloch">{{cite book | title= "Effective Java: Programming Language Guide" |last=Bloch| first=Joshua| publisher=Addison-Wesley | edition=third | isbn=978-0134685991| year=2018}}</ref>{{rp|157-167}} विज़ुअल बेसिक .NET, Java,[2]: 157–167 और कई अन्य प्रकार की भाषा में मौजूद हैं, जिनमें <code>switch</code>, <code>case</code>, <code>select</code> या <code>inspect</code>जैसे [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)|कीवर्ड]] का उपयोग किया जाता है। | ||
स्विच स्टेटमेंट दो मुख्य प्रकारों में आते हैं: एक संरचित स्विच, | स्विच स्टेटमेंट दो मुख्य प्रकारों में आते हैं: एक संरचित स्विच, जैसा कि पास्कल में होता है, जो बिल्कुल एक शाखा लेता है, और एक असंरचित स्विच, जैसा कि सी में होता है, जो एक प्रकार के [[ के लिए जाओ |गोटो]] के रूप में कार्य करता है। स्विच का उपयोग करने के मुख्य कारणों में दोहराए जाने वाले कोडिंग को कम करके स्पष्टता में सुधार करना और (यदि अनुमान अनुमति देता है) कई मामलों में आसान कंपाइलर अनुकूलन के माध्यम से तेजी से निष्पादन की क्षमता प्रदान करना शामिल है। | ||
{| align="right" | {| align="right" | ||
|+'''Switch statement in C''' | |+'''Switch statement in C''' | ||
Line 18: | Line 18: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|} | |} | ||
== इतिहास == | == इतिहास == | ||
अपने 1952 के पाठ इंट्रोडक्शन टू मेटामैथेमेटिक्स में, [[स्टीफन क्लेन]] ने औपचारिक रूप से साबित | अपने 1952 के पाठ इंट्रोडक्शन टू मेटामैथेमेटिक्स में, [[स्टीफन क्लेन]] ने औपचारिक रूप से साबित कर दिया कि CASE फ़ंक्शन (IF-THEN-ELSE फ़ंक्शन इसका सबसे सरल रूप है) एक आदिम पुनरावर्ती फ़ंक्शन है, जहां वह निम्नलिखित तरीके से <code>definition by cases</code> को परिभाषित करता है: | ||
: # | :"#F. The function φ defined thus | ||
:: φ(x<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+1</sub>(x<sub>1</sub> , ... , x<sub>n</sub> ) otherwise, जहां Q<sub>1</sub> , ... , Q<sub>m</sub> परस्पर अनन्य विधेय हैं (या φ(x<sub>1</sub> , ... , x<sub>n</sub>) का मान लागू होने वाले पहले खंड द्वारा दिया जाएगा) φ<sub>1</sub>, ..., φ<sub>m+1</sub>, Q<sub>1</sub>, ..., Q<sub>m+1</sub> में आदिम पुनरावर्ती है।<ref>"Definition by cases", Kleene 1952:229</ref> | ||
क्लेन बूलियन-जैसे पुनरावर्ती कार्यों "साइन-ऑफ़" sg( ) और "नॉट साइन ऑफ़" ~sg( ) के संदर्भ में इसका प्रमाण प्रदान करता है (क्लीन 1952:222-223); यदि इसका इनपुट सकारात्मक है तो पहला 1 लौटाता है और यदि इसका इनपुट नकारात्मक है तो −1 लौटाता है। | |||
बूलोस-बर्गेस-जेफरी ने अतिरिक्त अवलोकन किया कि "मामलों द्वारा परिभाषा" [[पारस्परिक विशिष्टता|पारस्परिक]] रूप से अनन्य और सामूहिक रूप से संपूर्ण होनी चाहिए। वे भी इस फ़ंक्शन की आदिम पुनरावर्तीता का प्रमाण देते हैं (बूलोस-बर्गेस-जेफरी 2002:74-75)। | |||
IF-THEN-ELSE मैकार्थी औपचारिकता का आधार है: इसका उपयोग आदिम रिकर्सन और [[इन-ऑपरेटर|म्यू-ऑपरेटर]] दोनों को प्रतिस्थापित करता है। | |||
IF-THEN-ELSE | |||
== विशिष्ट वाक्यविन्यास == | == विशिष्ट वाक्यविन्यास == | ||
अधिकांश भाषाओं में, प्रोग्रामर एक या दो कीवर्ड का उपयोग करके कई | अधिकांश भाषाओं में, प्रोग्रामर एक या दो कीवर्ड का उपयोग करके कई व्यक्तिगत लाइनों में एक स्विच स्टेटमेंट लिखते हैं। एक सामान्य वाक्यविन्यास में शामिल हैं: | ||
* पहला <code>select</code>, उसके बाद एक अभिव्यक्ति | * पहला <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> स्टेटमेंट बस बाहर निकल जाता है। अन्य में, जैसे पीएल/आई में, एक त्रुटि उत्पन्न होती है। | ||
== शब्दार्थ == | == शब्दार्थ == | ||
शब्दार्थ की दृष्टि से, स्विच | शब्दार्थ की दृष्टि से, स्विच कथन के दो मुख्य रूप हैं। | ||
पहला रूप संरचित स्विच है, जैसे पास्कल में, जहां | पहला रूप संरचित स्विच है, जैसे पास्कल में, जहां वास्तव में एक शाखा ली जाती है, और मामलों को अलग, विशिष्ट ब्लॉक के रूप में माना जाता है। यह एक सामान्यीकृत यदि-तब-अन्यथा [[सशर्त (कंप्यूटर प्रोग्रामिंग)|सशर्त]] के रूप में कार्य करता है, यहाँ केवल दो नहीं बल्कि किसी भी संख्या में शाखाएँ होती हैं। | ||
दूसरा रूप असंरचित स्विच | दूसरा रूप असंरचित स्विच है, जैसा कि सी में है, जहां मामलों को एक ही ब्लॉक के भीतर लेबल के रूप में माना जाता है, और स्विच एक सामान्यीकृत गोटो के रूप में कार्य करता है। इस भेद को फॉलथ्रू के उपचार के रूप में जाना जाता है, जिसे नीचे विस्तार से बताया गया है। | ||
=== फाल्थ्रू === | === फाल्थ्रू === | ||
कई भाषाओं में, केवल | कई भाषाओं में, केवल मेल खाने वाले ब्लॉक को निष्पादित किया जाता है, और फिर स्विच स्टेटमेंट के अंत में निष्पादन जारी रहता है। इनमें पास्कल परिवार (ऑब्जेक्ट पास्कल, मोडुला, ओबेरॉन, एडा, आदि) के साथ-साथ पीएल/आई, [[फोरट्रान]] के आधुनिक रूप और पास्कल से प्रभावित [[ बुनियादी |बेसिक]] बोलियाँ, अधिकांश कार्यात्मक भाषाएँ और कई अन्य शामिल हैं। एक ही कोड को निष्पादित करने के लिए कई मानों की अनुमति देने के लिए (और [[डुप्लिकेट कोड]] करने की आवश्यकता से बचने के लिए), पास्कल-प्रकार की भाषाएं प्रति मामले में किसी भी संख्या में मानों की अनुमति देती हैं, जो अल्पविराम से अलग की गई सूची के रूप में, एक श्रेणी के रूप में या एक संयोजन के रूप में दी जाती हैं। | ||
सी भाषा से प्राप्त भाषाएं, और आमतौर पर फोरट्रान की गणना की गई जीओटीओ से प्रभावित भाषाएं, इसके बजाय फॉलथ्रू की सुविधा देती हैं, जहां नियंत्रण मिलान | सी भाषा से प्राप्त भाषाएं, और आमतौर पर फोरट्रान की गणना की गई जीओटीओ से प्रभावित भाषाएं, इसके बजाय फॉलथ्रू की सुविधा देती हैं, जहां नियंत्रण मिलान मामले में चला जाता है, और फिर स्रोत पाठ में अगले मामले से जुड़े बयानों के लिए निष्पादन जारी रहता है ("गिरता है") . यह कई मानों को बिना किसी विशेष सिंटैक्स के एक ही बिंदु से मेल खाने की अनुमति देता है: वे बस खाली निकायों के साथ सूचीबद्ध होते हैं। केस बॉडी में कोड के साथ मूल्यों को विशेष रूप से अनुकूलित किया जा सकता है। व्यवहार में, फॉलथ्रू को आम तौर पर मिलान निकाय के अंत में एक <code>break</code> कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन से बाहर निकलता है, लेकिन यदि प्रोग्रामर <code>break</code> स्टेटमेंट डालना भूल जाता है तो यह अनजाने में फॉलथ्रू के कारण बग पैदा कर सकता है। इस प्रकार इसे कई लोगों द्वारा<ref>van der Linden, Peter (1994). ''Expert C Programming: Deep C Secrets'', p. 38. Prentice Hall, Eaglewood Cliffs. {{ISBN|0131774298}}.</ref> भाषा के मस्से के रूप में देखा जाता है, और कुछ लिंट टूल्स में इसके प्रति चेतावनी दी जाती है। वाक्यात्मक रूप से, मामलों को लेबल के रूप में समझा जाता है, ब्लॉक के रूप में नहीं, और स्विच और <code>break</code> स्टेटमेंट स्पष्ट रूप से नियंत्रण प्रवाह को बदलते हैं। सी से प्रभावित कुछ भाषाएं, जैसे कि [[जावास्क्रिप्ट]], डिफॉल्ट फॉलथ्रू को बरकरार रखती हैं, जबकि अन्य फॉलथ्रू को हटा देती हैं, या केवल विशेष परिस्थितियों में ही इसकी अनुमति देती हैं। सी-परिवार में इस पर उल्लेखनीय विविधताओं में सी# शामिल है, जिसमें सभी ब्लॉकों को <code>break</code> या <code>return</code> के साथ समाप्त किया जाना चाहिए जब तक कि ब्लॉक खाली न हो (यानी फॉलथ्रू का उपयोग कई मान निर्दिष्ट करने के तरीके के रूप में किया जाता है)। | ||
कुछ मामलों में भाषाएँ वैकल्पिक | कुछ मामलों में भाषाएँ वैकल्पिक फॉलथ्रू प्रदान करती हैं। उदाहरण के लिए, पर्ल डिफ़ॉल्ट रूप से विफल नहीं होता है, लेकिन एक मामला <code>continue</code> कीवर्ड का उपयोग करके स्पष्ट रूप से ऐसा कर सकता है। यह अनजाने में गिरने से रोकता है लेकिन जब चाहे तब इसकी अनुमति देता है। इसी प्रकार, [[बैश (यूनिक्स शेल)|बैश]] डिफ़ॉल्ट रूप से <code>;;</code> के साथ समाप्त होने पर फ़ॉलथ्रू नहीं करता है, लेकिन इसके बजाय <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> की अनुमति देता है। | ||
स्विच स्टेटमेंट का एक उदाहरण जो | स्विच स्टेटमेंट का एक उदाहरण जो फ़ॉलथ्रू पर निर्भर करता है वह डफ़ का उपकरण है। | ||
== संकलन == | == संकलन == | ||
[[अनुकूलन (कंप्यूटर विज्ञान)]] जैसे [[जीएनयू कंपाइलर संग्रह]] या [[बजना]] | [[अनुकूलन (कंप्यूटर विज्ञान)|ऑप्टिमाइजिंग कंपाइलर]] जैसे [[जीएनयू कंपाइलर संग्रह|GCC]] या [[बजना|Clang]] स्विच स्टेटमेंट को या तो एक [[शाखा तालिका|ब्रांच टेबल]] में या फिर केसेस में मौजूद मानों के माध्यम से एक [[बाइनरी खोज एल्गोरिदम|बाइनरी सर्च]] के रूप में कंपाइल कर सकते हैं।<ref>Vlad Lazarenko. [https://web.archive.org/web/20220313040503/http://lazarenko.me/switch/ From Switch Statement Down to Machine Code]</ref> एक ब्रांच टेबल को स्विच स्टेटमेंट को एक छोटे, स्थिर संख्यक निर्देशिका के रूप में कार्यान्वयन करने देता है जिससे कंपेयर को तुलनाओं की सूची से बिना जाना के विभाजन करने के लिए निर्देशिका में से निर्दिष्ट शाखा का निष्पादन करने में सक्षम होता है, जबकि बाइनरी सर्च में केवल लॉगारिदमिक संख्या की तुलना में कम्पेयरिजन होती है, जो स्विच स्टेटमेंट में केसेस की संख्या मापता है। | ||
एक | |||
आम तौर पर, यह पता लगाने का एकमात्र तरीका कि | आम तौर पर, यह पता लगाने का एकमात्र तरीका कि यह अनुकूलन हुआ है या नहीं, वास्तव में कंपाइलर द्वारा उत्पन्न परिणामी असेंबली या [[मशीन कोड]] आउटपुट को देखना है। | ||
==फायदे और नुकसान== | ==फायदे और नुकसान== | ||
{{Unreferenced|section|date=January 2017}} | {{Unreferenced|section|date=January 2017}} | ||
कुछ भाषाओं और प्रोग्रामिंग | कुछ भाषाओं और प्रोग्रामिंग वातावरणों में, <code>case</code> या <code>switch</code> स्टेटमेंट का उपयोग 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" के अनुक्रमों के लिए परिणामी नियंत्रण-प्रवाह ग्राफ़ में कई अधिक नोड्स और लगभग दोगुने किनारे होते हैं, इनमें कोई उपयोगी जानकारी नहीं जोड़ी जाती है। हालाँकि, 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> उदाहरण के लिए: | ||
<syntaxhighlight lang="java"> | |||
int ndays = switch(month) { | int ndays = switch(month) { | ||
case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31; | case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31; | ||
Line 106: | Line 102: | ||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== वैकल्पिक उपयोग == | |||
कई भाषाएँ रनटाइम के दौरान <code>switch</code> ब्लॉक के अंदर अभिव्यक्तियों का मूल्यांकन करती हैं, जिससे निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति मिलती है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग भाषाओं में अधिक आम है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड की तुलना में अधिक महत्वपूर्ण है। | |||
कई भाषाएँ अंदर भावों का मूल्यांकन करती हैं रनटाइम पर ब्लॉक, निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति देता है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग भाषाओं में अधिक आम है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड से अधिक महत्वपूर्ण है। | |||
== | === PHP === | ||
उदाहरण के लिए, [[पीएचपी|PHP]]में, एक स्थिरांक को जांचने के लिए "चर" के रूप में उपयोग किया जा सकता है, और पहला केस स्टेटमेंट जो उस स्थिरांक का मूल्यांकन करता है, निष्पादित किया जाएगा: | |||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
switch (true) { | switch (true) { | ||
Line 125: | Line 121: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
यह सुविधा कई मानों के विरुद्ध एक चर के | यह सुविधा कई मानों के विरुद्ध एक चर की तुलना में एक मान के विरुद्ध अनेक चरों की जाँच करने के लिए भी उपयोगी है। COBOL <code>EVALUATE</code> स्टेटमेंट में इस फॉर्म (और अन्य फॉर्म) का भी समर्थन करता है। पीएल/आई के पास <code>SELECT</code> स्टेटमेंट का एक वैकल्पिक रूप है जहां नियंत्रण अभिव्यक्ति पूरी तरह से छोड़ दी जाती है और सत्य का मूल्यांकन करने वाला पहला <code>WHEN</code> निष्पादित किया जाता है। | ||
=== रूबी === | === रूबी === | ||
[[रूबी (प्रोग्रामिंग भाषा)]] में, | [[रूबी (प्रोग्रामिंग भाषा)|रूबी]] में, <code>===</code> समानता से निपटने के कारण, कथन का उपयोग चर की कक्षा के परीक्षण के लिए किया जा सकता है: | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
Line 136: | Line 132: | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
रूबी एक मान भी लौटाती है जिसे एक वेरिएबल को सौंपा जा सकता है, और वास्तव में | रूबी एक मान भी लौटाती है जिसे एक वेरिएबल को सौंपा जा सकता है, और वास्तव में <code>case</code> को किसी भी पैरामीटर की आवश्यकता नहीं होती है (कुछ <code>else if</code> की तरह कार्य करते हुए): | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
Line 148: | Line 144: | ||
normal | normal | ||
end</syntaxhighlight> | end</syntaxhighlight> | ||
=== असेंबलर === | === असेंबलर === | ||
असेंबली भाषा में एक स्विच स्टेटमेंट: | असेंबली भाषा में एक स्विच स्टेटमेंट: | ||
Line 182: | Line 176: | ||
===पायथन === | ===पायथन === | ||
पायथन 3.10.6 के लिए, [[पायथन संवर्धन प्रस्ताव]] 634-636 को स्वीकार | पायथन 3.10.6 के लिए, [[पायथन संवर्धन प्रस्ताव|पीईपी]] 634-636 को स्वीकार किया गया, जिसमें {{code|lang=python|match}} और {{code|lang=python|case}} कीवर्ड जोड़े गए।<ref>{{Cite web |last=Galindo Salgado |first=Pablo |title=What's New In Python 3.10 |url=https://docs.python.org/3/whatsnew/3.10.html |access-date=2022-08-19 |website=Python 3.10.6 documentation}}</ref><ref>{{Cite web |last=Bucher |first=Brandt |last2=van Rossum |first2=Guido |author-link2=Guido van Rossum |date=2020-09-12 |title=PEP 634 – Structural Pattern Matching: Specification |url=https://peps.python.org/pep-0634/ |access-date=2022-08-19 |website=Python Enhancement Proposals}}</ref><ref>{{Cite web |last=Kohn |first=Tobias |author-link=Guido van Rossum |last2=van Rossum |first2=Guido |date=2020-09-12 |title=PEP 635 – Structural Pattern Matching: Motivation and Rationale |url=https://peps.python.org/pep-0635/ |access-date=2022-08-19 |website=Python Enhancement Proposals}}</ref><ref>{{Cite web |last=Moisset |first=Daniel F |title=PEP 636 – Structural Pattern Matching: Tutorial |url=https://peps.python.org/pep-0636/ |access-date=2022-08-19 |website=Python Enhancement Proposals}}</ref> अन्य भाषाओं के विपरीत, पायथन विशेष रूप से पतनशील व्यवहार प्रदर्शित नहीं करता है। | ||
<syntaxhighlight lang="py"> | <syntaxhighlight lang="py"> | ||
letter = input("Put in a single letter: ").strip()[0].casefold() # first non-whitespace character of the input, lowercase | letter = input("Put in a single letter: ").strip()[0].casefold() # first non-whitespace character of the input, lowercase | ||
Line 193: | Line 187: | ||
print(f"Letter {letter} is not a vowel!") | print(f"Letter {letter} is not a vowel!") | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== अपवाद हैंडलिंग === | === अपवाद हैंडलिंग === | ||
कई भाषाएँ अपवाद | कई भाषाएँ अपवाद हैंडलिंग में स्विच स्टेटमेंट के एक रूप को लागू करती हैं, जहाँ यदि किसी ब्लॉक में कोई अपवाद उठाया जाता है, तो अपवाद के आधार पर एक अलग शाखा चुनी जाती है। कुछ मामलों में, यदि कोई अपवाद नहीं उठाया गया है, तो एक डिफ़ॉल्ट शाखा भी मौजूद है। एक प्रारंभिक उदाहरण मॉड्यूल-3 है, जो <code>TRY</code>...<code>EXCEPT</code> सिंटैक्स का उपयोग करता है, जहां प्रत्येक <code>EXCEPT</code> एक मामले को परिभाषित करता है। यह [[डेल्फ़ी (प्रोग्रामिंग भाषा)|डेल्फ़ी]], [[स्काला (प्रोग्रामिंग भाषा)|स्कैला]] और विज़ुअल बेसिक .NET में भी पाया जाता है। | ||
== विकल्प == | == विकल्प == | ||
कथनों को बदलने के कुछ विकल्प हो सकते हैं: | |||
* यदि- | * यदि-अन्यथा [[सशर्त (प्रोग्रामिंग)|सशर्त]] की एक श्रृंखला जो लक्ष्य की एक समय में एक मान की जांच करती है। फाल्थ्रू व्यवहार को अन्य खंड के बिना प्रत्येक सशर्त के अनुक्रम के साथ प्राप्त किया जा सकता है। | ||
* एक लुकअप | * एक लुकअप टेबल, जिसमें कुंजियों के रूप में, <code>case</code> मान और, मान के रूप में, <code>case</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" /> कुछ मामलों में, लुकअप टेबल गैर-अनुकूलित <code>switch</code> स्टेटमेंट की तुलना में अधिक कुशल होते हैं क्योंकि कई भाषाएं टेबल लुकअप को अनुकूलित कर सकती हैं, जबकि स्विच स्टेटमेंट को तब तक अनुकूलित नहीं किया जाता है जब तक कि मानों की सीमा कुछ अंतराल के साथ छोटी न हो। हालाँकि, एक गैर-अनुकूलित, गैर-बाइनरी खोज लुकअप लगभग निश्चित रूप से एक गैर-अनुकूलित स्विच या समकक्ष एकाधिक यदि-अन्यथा कथनों की तुलना में धीमा होगा।{{citation needed|date=October 2011}} | |||
*यदि आवश्यक हो तो एक नियंत्रण तालिका (जिसे एक साधारण लुकअप तालिका के रूप में कार्यान्वित किया जा सकता है) को एकाधिक इनपुट पर कई स्थितियों को समायोजित करने के लिए भी अनुकूलित किया जा सकता है और आमतौर पर एक समकक्ष स्विच (जो कई कथनों पर कब्जा कर सकता है) की तुलना में अधिक 'विज़ुअल कॉम्पैक्टनेस' प्रदर्शित करता है। | |||
* यदि आवश्यक हो तो एक नियंत्रण तालिका (जिसे एक साधारण लुकअप तालिका के रूप में कार्यान्वित किया जा सकता है) को | *[[पैटर्न मिलान]], जिसका उपयोग कई [[कार्यात्मक प्रोग्रामिंग|कार्यात्मक]] भाषाओं में स्विच-जैसी कार्यक्षमता को कार्यान्वित करने के लिए किया जाता है। | ||
* [[पैटर्न मिलान]], जिसका उपयोग कई [[कार्यात्मक प्रोग्रामिंग]] भाषाओं में स्विच जैसी कार्यक्षमता को | |||
== यह भी देखें == | == यह भी देखें == |
Revision as of 09:20, 21 July 2023
This article needs additional citations for verification. (April 2013) (Learn how and when to remove this template message) |
कंप्यूटर प्रोग्रामिंग भाषाओं में, स्विच स्टेटमेंट एक प्रकार का चयन नियंत्रण तंत्र है जिसका उपयोग एक चर या व्यक्ति व्यक्ति के मान को परिवर्तित करने के लिए किया जाता है ताकि कार्यक्रम के नियंत्रण विकल्प को खोजने और मैप करने के माध्यम से कार्यक्रम का निष्पादन बदल सके।
स्विच स्टेटमेंट कुछ हद तक C/C++, C#, विज़ुअल बेसिक .NET, Java जैसी प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले if
स्टेटमेंट के समान कार्य करते हैं और अधिकांश उच्च स्तरीय अनिवार्य प्रोग्रामिंग भाषाओं जैसे पास्कल, Ada, C/C++, C#,[1]: 157–167 विज़ुअल बेसिक .NET, Java,[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. The function φ defined thus
- φ(x1 , ... , xn ) =
- φ1(x1 , ... , xn ) if Q1(x1 , ... , xn ),
- . . . . . . . . . . . .
- φm(x1 , ... , xn ) if Qm(x1 , ... , xn ),
- φm+1(x1 , ... , xn ) otherwise, जहां Q1 , ... , Qm परस्पर अनन्य विधेय हैं (या φ(x1 , ... , xn) का मान लागू होने वाले पहले खंड द्वारा दिया जाएगा) φ1, ..., φm+1, Q1, ..., Qm+1 में आदिम पुनरावर्ती है।[2]
- φ(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
स्टेटमेंट बस बाहर निकल जाता है। अन्य में, जैसे पीएल/आई में, एक त्रुटि उत्पन्न होती है।
शब्दार्थ
शब्दार्थ की दृष्टि से, स्विच कथन के दो मुख्य रूप हैं।
पहला रूप संरचित स्विच है, जैसे पास्कल में, जहां वास्तव में एक शाखा ली जाती है, और मामलों को अलग, विशिष्ट ब्लॉक के रूप में माना जाता है। यह एक सामान्यीकृत यदि-तब-अन्यथा सशर्त के रूप में कार्य करता है, यहाँ केवल दो नहीं बल्कि किसी भी संख्या में शाखाएँ होती हैं।
दूसरा रूप असंरचित स्विच है, जैसा कि सी में है, जहां मामलों को एक ही ब्लॉक के भीतर लेबल के रूप में माना जाता है, और स्विच एक सामान्यीकृत गोटो के रूप में कार्य करता है। इस भेद को फॉलथ्रू के उपचार के रूप में जाना जाता है, जिसे नीचे विस्तार से बताया गया है।
फाल्थ्रू
कई भाषाओं में, केवल मेल खाने वाले ब्लॉक को निष्पादित किया जाता है, और फिर स्विच स्टेटमेंट के अंत में निष्पादन जारी रहता है। इनमें पास्कल परिवार (ऑब्जेक्ट पास्कल, मोडुला, ओबेरॉन, एडा, आदि) के साथ-साथ पीएल/आई, फोरट्रान के आधुनिक रूप और पास्कल से प्रभावित बेसिक बोलियाँ, अधिकांश कार्यात्मक भाषाएँ और कई अन्य शामिल हैं। एक ही कोड को निष्पादित करने के लिए कई मानों की अनुमति देने के लिए (और डुप्लिकेट कोड करने की आवश्यकता से बचने के लिए), पास्कल-प्रकार की भाषाएं प्रति मामले में किसी भी संख्या में मानों की अनुमति देती हैं, जो अल्पविराम से अलग की गई सूची के रूप में, एक श्रेणी के रूप में या एक संयोजन के रूप में दी जाती हैं।
सी भाषा से प्राप्त भाषाएं, और आमतौर पर फोरट्रान की गणना की गई जीओटीओ से प्रभावित भाषाएं, इसके बजाय फॉलथ्रू की सुविधा देती हैं, जहां नियंत्रण मिलान मामले में चला जाता है, और फिर स्रोत पाठ में अगले मामले से जुड़े बयानों के लिए निष्पादन जारी रहता है ("गिरता है") . यह कई मानों को बिना किसी विशेष सिंटैक्स के एक ही बिंदु से मेल खाने की अनुमति देता है: वे बस खाली निकायों के साथ सूचीबद्ध होते हैं। केस बॉडी में कोड के साथ मूल्यों को विशेष रूप से अनुकूलित किया जा सकता है। व्यवहार में, फॉलथ्रू को आम तौर पर मिलान निकाय के अंत में एक break
कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन से बाहर निकलता है, लेकिन यदि प्रोग्रामर break
स्टेटमेंट डालना भूल जाता है तो यह अनजाने में फॉलथ्रू के कारण बग पैदा कर सकता है। इस प्रकार इसे कई लोगों द्वारा[3] भाषा के मस्से के रूप में देखा जाता है, और कुछ लिंट टूल्स में इसके प्रति चेतावनी दी जाती है। वाक्यात्मक रूप से, मामलों को लेबल के रूप में समझा जाता है, ब्लॉक के रूप में नहीं, और स्विच और break
स्टेटमेंट स्पष्ट रूप से नियंत्रण प्रवाह को बदलते हैं। सी से प्रभावित कुछ भाषाएं, जैसे कि जावास्क्रिप्ट, डिफॉल्ट फॉलथ्रू को बरकरार रखती हैं, जबकि अन्य फॉलथ्रू को हटा देती हैं, या केवल विशेष परिस्थितियों में ही इसकी अनुमति देती हैं। सी-परिवार में इस पर उल्लेखनीय विविधताओं में सी# शामिल है, जिसमें सभी ब्लॉकों को break
या return
के साथ समाप्त किया जाना चाहिए जब तक कि ब्लॉक खाली न हो (यानी फॉलथ्रू का उपयोग कई मान निर्दिष्ट करने के तरीके के रूप में किया जाता है)।
कुछ मामलों में भाषाएँ वैकल्पिक फॉलथ्रू प्रदान करती हैं। उदाहरण के लिए, पर्ल डिफ़ॉल्ट रूप से विफल नहीं होता है, लेकिन एक मामला continue
कीवर्ड का उपयोग करके स्पष्ट रूप से ऐसा कर सकता है। यह अनजाने में गिरने से रोकता है लेकिन जब चाहे तब इसकी अनुमति देता है। इसी प्रकार, बैश डिफ़ॉल्ट रूप से ;;
के साथ समाप्त होने पर फ़ॉलथ्रू नहीं करता है, लेकिन इसके बजाय ;&
या ;;&
के साथ फॉलथ्रू[4] की अनुमति देता है।
स्विच स्टेटमेंट का एक उदाहरण जो फ़ॉलथ्रू पर निर्भर करता है वह डफ़ का उपकरण है।
संकलन
ऑप्टिमाइजिंग कंपाइलर जैसे GCC या Clang स्विच स्टेटमेंट को या तो एक ब्रांच टेबल में या फिर केसेस में मौजूद मानों के माध्यम से एक बाइनरी सर्च के रूप में कंपाइल कर सकते हैं।[5] एक ब्रांच टेबल को स्विच स्टेटमेंट को एक छोटे, स्थिर संख्यक निर्देशिका के रूप में कार्यान्वयन करने देता है जिससे कंपेयर को तुलनाओं की सूची से बिना जाना के विभाजन करने के लिए निर्देशिका में से निर्दिष्ट शाखा का निष्पादन करने में सक्षम होता है, जबकि बाइनरी सर्च में केवल लॉगारिदमिक संख्या की तुलना में कम्पेयरिजन होती है, जो स्विच स्टेटमेंट में केसेस की संख्या मापता है।
आम तौर पर, यह पता लगाने का एकमात्र तरीका कि यह अनुकूलन हुआ है या नहीं, वास्तव में कंपाइलर द्वारा उत्पन्न परिणामी असेंबली या मशीन कोड आउटपुट को देखना है।
फायदे और नुकसान
This section does not cite any sources. (January 2017) (Learn how and when to remove this template message) |
कुछ भाषाओं और प्रोग्रामिंग वातावरणों में, case
या switch
स्टेटमेंट का उपयोग if else if स्टेटमेंट की समकक्ष श्रृंखला से बेहतर माना जाता है क्योंकि यह है:
- डिबग करना आसान है (उदाहरण के लिए कोड बनाम कॉल टेबल पर ब्रेकपॉइंट सेट करना, यदि डिबगर में कोई सशर्त ब्रेकपॉइंट क्षमता नहीं है)
- किसी व्यक्ति के लिए पढ़ना आसान है
- समझना आसान है, और परिणामस्वरूप बनाए रखना आसान है
- निश्चित गहराई: "अगर और अगर" कथनों का एक क्रम गहरी नेस्टिंग उत्पन्न कर सकता है, जिससे संकलन अधिक कठिन हो जाता है (विशेषकर स्वचालित रूप से उत्पन्न कोड में)
- यह सत्यापित करना आसान है कि सभी मान संभाले गए हैं। यदि कुछ एनम मानों को प्रबंधित नहीं किया जाता है तो कंपाइलर चेतावनी जारी कर सकते हैं।
इसके अतिरिक्त, एक अनुकूलित कार्यान्वयन विकल्प की तुलना में बहुत तेजी से निष्पादित हो सकता है, क्योंकि इसे अक्सर अनुक्रमित शाखा तालिका का उपयोग करके कार्यान्वित किया जाता है।[6] उदाहरण के लिए, एकल वर्ण के मान के आधार पर प्रोग्राम प्रवाह तय करना, यदि सही ढंग से लागू किया जाता है, तो विकल्प की तुलना में काफी अधिक कुशल है, जिससे निर्देश पथ की लंबाई काफी कम हो जाती है। जब इसे इस प्रकार लागू किया जाता है, तो एक स्विच स्टेटमेंट अनिवार्य रूप से एक आदर्श हैश बन जाता है।
नियंत्रण-प्रवाह ग्राफ के संदर्भ में, एक स्विच स्टेटमेंट में दो नोड्स (प्रवेश और निकास) होते हैं, साथ ही प्रत्येक विकल्प के लिए उनके बीच एक किनारा होता है। इसके विपरीत, "यदि...अन्यथा यदि...अन्यथा यदि" कथनों के अनुक्रम में पहले और अंतिम के अलावा प्रत्येक मामले के लिए एक अतिरिक्त नोड होता है, साथ में संगत किनारा भी होता है। इस प्रकार "if" के अनुक्रमों के लिए परिणामी नियंत्रण-प्रवाह ग्राफ़ में कई अधिक नोड्स और लगभग दोगुने किनारे होते हैं, इनमें कोई उपयोगी जानकारी नहीं जोड़ी जाती है। हालाँकि, if स्टेटमेंट्स में सरल शाखाएँ स्विच स्टेटमेंट की जटिल शाखा की तुलना में व्यक्तिगत रूप से वैचारिक रूप से आसान होती हैं। चक्रीय जटिलता के संदर्भ में, यदि k मामले दिए जाएं तो ये दोनों विकल्प इसे k-1 तक बढ़ा देते हैं।
अभिव्यक्ति स्विच करें
स्विच एक्सप्रेशन जावा एसई 12, 19 मार्च 2019 में एक पूर्वावलोकन सुविधा के रूप में पेश किए गए हैं। यहां एक मान वापस करने के लिए संपूर्ण स्विच एक्सप्रेशन का उपयोग किया जा सकता है। केस लेबल का एक नया रूप भी है, case L->
जहां दाईं ओर एक एकल अभिव्यक्ति है। हालाँकि, यह गिरावट को भी रोकता है और इसके लिए आवश्यक है कि मामले विस्तृत हों। जावा एसई 13 में yield
स्टेटमेंट पेश किया गया है, और जावा एसई 14 में स्विच एक्सप्रेशन एक मानक भाषा सुविधा बन जाता है।[7][8][9] उदाहरण के लिए:
int ndays = switch(month) {
case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31;
case APR, JUN, SEP, NOV -> 30;
case FEB -> {
if (year % 400 == 0) yield 29;
else if (year % 100 == 0) yield 28;
else if (year % 4 == 0) yield 29;
else yield 28; }
};
वैकल्पिक उपयोग
कई भाषाएँ रनटाइम के दौरान switch
ब्लॉक के अंदर अभिव्यक्तियों का मूल्यांकन करती हैं, जिससे निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति मिलती है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग भाषाओं में अधिक आम है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड की तुलना में अधिक महत्वपूर्ण है।
कई भाषाएँ अंदर भावों का मूल्यांकन करती हैं रनटाइम पर ब्लॉक, निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति देता है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग भाषाओं में अधिक आम है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड से अधिक महत्वपूर्ण है।
PHP
उदाहरण के लिए, PHPमें, एक स्थिरांक को जांचने के लिए "चर" के रूप में उपयोग किया जा सकता है, और पहला केस स्टेटमेंट जो उस स्थिरांक का मूल्यांकन करता है, निष्पादित किया जाएगा:
switch (true) {
case ($x == 'hello'):
foo();
break;
case ($z == 'howdy'): break;
}
switch (5) {
case $x: break;
case $y: break;
}
यह सुविधा कई मानों के विरुद्ध एक चर की तुलना में एक मान के विरुद्ध अनेक चरों की जाँच करने के लिए भी उपयोगी है। COBOL EVALUATE
स्टेटमेंट में इस फॉर्म (और अन्य फॉर्म) का भी समर्थन करता है। पीएल/आई के पास SELECT
स्टेटमेंट का एक वैकल्पिक रूप है जहां नियंत्रण अभिव्यक्ति पूरी तरह से छोड़ दी जाती है और सत्य का मूल्यांकन करने वाला पहला WHEN
निष्पादित किया जाता है।
रूबी
रूबी में, ===
समानता से निपटने के कारण, कथन का उपयोग चर की कक्षा के परीक्षण के लिए किया जा सकता है:
case input
when Array then puts 'input is an Array!'
when Hash then puts 'input is a Hash!'
end
रूबी एक मान भी लौटाती है जिसे एक वेरिएबल को सौंपा जा सकता है, और वास्तव में case
को किसी भी पैरामीटर की आवश्यकता नहीं होती है (कुछ else if
की तरह कार्य करते हुए):
catfood =
case
when cat.age <= 1
junior
when cat.age > 10
senior
else
normal
end
असेंबलर
असेंबली भाषा में एक स्विच स्टेटमेंट:
switch:
cmp ah, 00h
je a
cmp ah, 01h
je b
jmp swtend ; No cases match or "default" code here
a:
push ah
mov al, 'a'
mov ah, 0Eh
mov bh, 00h
int 10h
pop ah
jmp swtend ; Equivalent to "break"
b:
push ah
mov al, 'b'
mov ah, 0Eh
mov bh, 00h
int 10h
pop ah
jmp swtend ; Equivalent to "break"
...
swtend:
पायथन
पायथन 3.10.6 के लिए, पीईपी 634-636 को स्वीकार किया गया, जिसमें match
और case
कीवर्ड जोड़े गए।[10][11][12][13] अन्य भाषाओं के विपरीत, पायथन विशेष रूप से पतनशील व्यवहार प्रदर्शित नहीं करता है।
letter = input("Put in a single letter: ").strip()[0].casefold() # first non-whitespace character of the input, lowercase
match letter:
case 'a' | 'e' | 'i' | 'o' | 'u': # Unlike conditions in if statements, the `or` keyword cannot be used here to differentiate between cases
print(f"Letter {letter} is a vowel!")
case 'y':
print(f"Letter {letter} may be a vowel.)
case _: # `case _` is equivalent to `default` from C and others
print(f"Letter {letter} is not a vowel!")
अपवाद हैंडलिंग
कई भाषाएँ अपवाद हैंडलिंग में स्विच स्टेटमेंट के एक रूप को लागू करती हैं, जहाँ यदि किसी ब्लॉक में कोई अपवाद उठाया जाता है, तो अपवाद के आधार पर एक अलग शाखा चुनी जाती है। कुछ मामलों में, यदि कोई अपवाद नहीं उठाया गया है, तो एक डिफ़ॉल्ट शाखा भी मौजूद है। एक प्रारंभिक उदाहरण मॉड्यूल-3 है, जो TRY
...EXCEPT
सिंटैक्स का उपयोग करता है, जहां प्रत्येक EXCEPT
एक मामले को परिभाषित करता है। यह डेल्फ़ी, स्कैला और विज़ुअल बेसिक .NET में भी पाया जाता है।
विकल्प
कथनों को बदलने के कुछ विकल्प हो सकते हैं:
- यदि-अन्यथा सशर्त की एक श्रृंखला जो लक्ष्य की एक समय में एक मान की जांच करती है। फाल्थ्रू व्यवहार को अन्य खंड के बिना प्रत्येक सशर्त के अनुक्रम के साथ प्राप्त किया जा सकता है।
- एक लुकअप टेबल, जिसमें कुंजियों के रूप में,
case
मान और, मान के रूप में,case
स्टेटमेंट के अंतर्गत भाग शामिल होता है।
- (कुछ भाषाओं में, केवल वास्तविक डेटा प्रकारों को लुकअप तालिका में मान के रूप में अनुमति दी जाती है। अन्य भाषाओं में, वास्तविक
switch
स्टेटमेंट के समान लचीलापन प्राप्त करते हुए, लुकअप तालिका मान के रूप में फ़ंक्शन निर्दिष्ट करना भी संभव है। अधिक के लिए नियंत्रण तालिका आलेख देखें इस पर विस्तार से)।
- (कुछ भाषाओं में, केवल वास्तविक डेटा प्रकारों को लुकअप तालिका में मान के रूप में अनुमति दी जाती है। अन्य भाषाओं में, वास्तविक
लुआ केस/स्विच स्टेटमेंट का समर्थन नहीं करता है।[14] यह लुकअप तकनीक लुआ भाषा में switch
स्टेटमेंट को लागू करने का एक तरीका है, जिसमें कोई अंतर्निहित switch
नहीं है।[14] कुछ मामलों में, लुकअप टेबल गैर-अनुकूलित switch
स्टेटमेंट की तुलना में अधिक कुशल होते हैं क्योंकि कई भाषाएं टेबल लुकअप को अनुकूलित कर सकती हैं, जबकि स्विच स्टेटमेंट को तब तक अनुकूलित नहीं किया जाता है जब तक कि मानों की सीमा कुछ अंतराल के साथ छोटी न हो। हालाँकि, एक गैर-अनुकूलित, गैर-बाइनरी खोज लुकअप लगभग निश्चित रूप से एक गैर-अनुकूलित स्विच या समकक्ष एकाधिक यदि-अन्यथा कथनों की तुलना में धीमा होगा।[citation needed]
- यदि आवश्यक हो तो एक नियंत्रण तालिका (जिसे एक साधारण लुकअप तालिका के रूप में कार्यान्वित किया जा सकता है) को एकाधिक इनपुट पर कई स्थितियों को समायोजित करने के लिए भी अनुकूलित किया जा सकता है और आमतौर पर एक समकक्ष स्विच (जो कई कथनों पर कब्जा कर सकता है) की तुलना में अधिक 'विज़ुअल कॉम्पैक्टनेस' प्रदर्शित करता है।
- पैटर्न मिलान, जिसका उपयोग कई कार्यात्मक भाषाओं में स्विच-जैसी कार्यक्षमता को कार्यान्वित करने के लिए किया जाता है।
यह भी देखें
- एल्गोरिथम दक्षता
- शाखा तालिका
- नियंत्रण तालिका
- डफ का उपकरण
- सूचकांक मानचित्रण
संदर्भ
- ↑ 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.
- ↑ 14.0 14.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.