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

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

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

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

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


 * "#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 में आदिम पुनरावर्ती है।
 * φm+1(x1, ... , xn ) otherwise, जहां Q1 , ... , Qm परस्पर अनन्य विधेय हैं (या φ(x1 , ... , xn) का मान लागू होने वाले पहले खंड द्वारा दिया जाएगा) φ1, ..., φm+1, Q1, ..., Qm+1 में आदिम पुनरावर्ती है।

क्लेन बूलियन-जैसे पुनरावर्ती कार्यों "साइन-ऑफ़" sg और "नॉट साइन ऑफ़" ~sg के संदर्भ में इसका प्रमाण प्रदान करता है (क्लीन 1952:222-223); यदि इसका इनपुट सकारात्मक है तो पहला 1 लौटाता है और यदि इसका इनपुट नकारात्मक है तो −1 लौटाता है।

बूलोस-बर्गेस-जेफरी ने अतिरिक्त अवलोकन किया कि "मामलों द्वारा परिभाषा" पारस्परिक रूप से अनन्य और सामूहिक रूप से संपूर्ण होनी चाहिए। वे भी इस फ़ंक्शन की आदिम पुनरावर्तीता का प्रमाण देते हैं (बूलोस-बर्गेस-जेफरी 2002:74-75)।

IF-THEN-ELSE मैकार्थी औपचारिकता का आधार है: इसका उपयोग आदिम रिकर्सन और म्यू-ऑपरेटर दोनों को प्रतिस्थापित करता है।

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

रूबी एक मान भी लौटाती है जिसे एक वेरिएबल को सौंपा जा सकता है, और वास्तव में  को किसी भी पैरामीटर की आवश्यकता नहीं होती है (कुछ   की तरह कार्य करते हुए):

असेंबलर
असेंबली भाषा में एक स्विच स्टेटमेंट:

पायथन
पायथन 3.10.6 के लिए, पीईपी 634-636 को स्वीकार किया गया, जिसमें match और case कीवर्ड जोड़े गए।   अन्य भाषाओं के विपरीत, पायथन विशेष रूप से पतनशील व्यवहार प्रदर्शित नहीं करता है।

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

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


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

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

यह भी देखें

 * एल्गोरिथम दक्षता
 * शाखा तालिका
 * नियंत्रण तालिका
 * डफ का उपकरण
 * सूचकांक मानचित्रण

अग्रिम पठन

 * 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.

Оператор ветвления