कथन बदलें (स्विच स्टेटमेंट): Difference between revisions
No edit summary |
No edit summary |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 216: | 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. | ||
[[ru:Оператор ветвления#Переключатель (оператор множественного выбора)]] | [[ru:Оператор ветвления#Переключатель (оператор множественного выбора)]] | ||
[[Category:All articles with unsourced statements]] | |||
[[Category:Articles with unsourced statements from October 2011]] | |||
[[Category: | |||
[[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 जैसे अनस्ट्रक्चर्ड स्विच जो एक तरह के गोटू के रूप में काम करता है। स्विच का उपयोग करने के मुख्य कारण में से एक यह है कि यह स्पष्टता को उत्कृष्ट बनाने में सहायता करता है, क्योंकि इससे पुनरावृत्तीय कोडिंग को कम किया जा सकता है, और (यदि ह्यूरिस्टिक्स अनुमति प्रदान करती है) बहुत से स्थितियों में सहज कंपाइलर अनुकूलन के माध्यम से तेज निष्पादन की संभावना भी प्रदान करता है।
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
कीवर्ड द्वारा निर्दिष्ट होता है। यह तब निष्पादित होता है जब कोई अन्य मामला कण्ट्रोल एक्सप्रेशन से मेल नहीं खाता है। कुछ लैंगुएजेस में, जैसे कि C, यदि कोई भी स्थिति समतुल्य नहीं होती है और default
को छोड़ दिया जाता है तो switch
स्टेटमेंट बस समाप्त हो जाता है। अन्य में, जैसे पीएल/आई में, एक त्रुटि उत्पन्न होती है।
शब्दार्थ
शब्दार्थ की दृष्टि से, स्विच स्टेटमेंट के दो मुख्य रूप हैं।
सर्वप्रथम रूप स्ट्रक्चर्ड स्विच है, जैसे पास्कल में, जहां यथार्थतः एक ब्रांच प्राप्त करता है, और स्थितियों को अलग, विशिष्ट ब्लॉक के रूप में माना जाता है। यह एक सामान्यीकृत if–then–else सशर्त के रूप में कार्य करता है, यहाँ केवल दो नहीं बल्कि किसी भी संख्या में ब्रांचएँ होती हैं।
दूसरा रूप अनस्ट्रक्चर्ड स्विच है, जैसा कि C में है, जहां स्थितियों को एक ही ब्लॉक के भीतर लेबल के रूप में माना जाता है, और स्विच एक सामान्यीकृत गोटो के रूप में कार्य करता है। इस भेद को फॉलथ्रू के उपचार के रूप में जाना जाता है, जिसे नीचे विस्तार से बताया गया है।
फाल्थ्रू
कई लैंगुएजेस में, केवल समतुल्य ब्लॉक को निष्पादित किया जाता है, और फिर स्विच स्टेटमेंट के अंत में निष्पादन सतत रहता है। इनमें पास्कल वर्ग (ऑब्जेक्ट पास्कल, मोडुला, ओबेरॉन, एडा, आदि) के साथ-साथ पीएल/आई, फोरट्रान के आधुनिक रूप और पास्कल से प्रभावित बेसिक बोलियाँ, अधिकांश कार्यात्मक लैंगुएजेस और कई अन्य सम्मिलित हैं। एक ही कोड को निष्पादित करने के लिए कई मानों की अनुमति देने के लिए (और डुप्लिकेट कोड करने की आवश्यकता से बचने के लिए), पास्कल-प्रकार की लैंगुएजेस प्रति स्थिति में किसी भी संख्या में मानों की अनुमति देती हैं, जो अल्पविराम से अलग की गई सूची के रूप में, एक श्रेणी के रूप में या एक संयोजन के रूप में दी जाती हैं।
C लैंगुएज से प्रगत लैंगुएजेस और अधिक सामान्य रूप से फोरट्रान के गणना की गई जीओटीओ से प्रभावित लैंगुएजेस, फॉलथ्रू का प्रदर्शन करती हैं। इसमें कण्ट्रोल मिलता है जो मिलाने वाले केस में जाता है, और फिर निष्पादन सोर्स पाठ में अगले केस के साथ जारी रखता है ("फॉलथ्रू" होता है)। फॉलथ्रू के द्वारा, एक ही बिंदु के साथ कई मान पूर्णतः कोई विशेष विधि के बिना मिल सकते हैं: वे बस एम्प्टी बॉडी के साथ सूचीबद्ध होते हैं। मानों को मामले के शरीर में कोड से विशेष शर्ताधारी किया जा सकता है। व्यावहारिक रूप से, फॉलथ्रू साधारण तौर पर मिलाने वाले शरीर के अंत में एक ब्रेक कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन को बंद कर देता है, लेकिन अगर प्रोग्रामर भूल जाता है तो यह अचानकी फॉलथ्रू के कारण बग्स का कारण बन सकता है। केस बॉडी में कोड के साथ मूल्यों को विशेष रूप से अनुकूलित किया जा सकता है। व्यवहार में, फॉलथ्रू को सामान्यतः मिलान निकाय के अंत में एक break
कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन से बाहर निकलता है, लेकिन यदि प्रोग्रामर break
स्टेटमेंट डालना भूल जाता है तो यह अनजाने में फॉलथ्रू के कारण बग उत्पन्न कर सकता है। इस प्रकार इसे कई लोगों द्वारा[4] लैंगुएज के मस्से के रूप में देखा जाता है, और कुछ लिंट टूल्स में इसके प्रति चेतावनी दी जाती है। वाक्यात्मक रूप से, स्थितियों को लेबल के रूप में समझा जाता है, ब्लॉक के रूप में नहीं, और स्विच और break
स्टेटमेंट स्पष्ट रूप से कण्ट्रोल प्रवाह को बदलते हैं। C से प्रभावित कुछ लैंगुएजेस, जैसे कि JavaScript, डिफॉल्ट फॉलथ्रू को बनाए रखती हैं, जबकि अन्य फॉलथ्रू को हटा देती हैं, या केवल विशेष परिस्थितियों में ही इसकी अनुमति देती हैं। सी-वर्ग में इस पर उल्लेखनीय विविधताओं में C# सम्मिलित है, जिसमें सभी ब्लॉकों को 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 तक बढ़ा देते हैं।
एक्सप्रेशन स्विच करें
स्विच एक्सप्रेशन 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]
- यदि आवश्यकता हो, तो एक कण्ट्रोल टेबल (जो एक साधारण लुकअप टेबल के रूप में कार्यान्वयन किया जा सकता है) भी एक से अधिक इनपुट पर एकाधिक स्थितियों को समायोजित करने के लिए अनुकूलित किया जा सकता है और सामन्यतः एक समान स्विच की तुलना में अधिक 'दृश्य संक्षेपता' दिखाता है (जो कई स्टेटमेंट को आवास कर सकता है)।
- पैटर्न मिलान, जिसका उपयोग कई कार्यात्मक लैंगुएजेस में स्विच-जैसी कार्यक्षमता को कार्यान्वित करने के लिए किया जाता है।
यह भी देखें
- एल्गोरिथम दक्षता
- ब्रांच टेबल
- कण्ट्रोल टेबल
- डफ की युक्ति
- इंडेक्स मैपिंग
संदर्भ
- ↑ 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.