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

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

स्विच स्टेटमेंट कुछ हद तक इसी तरह कार्य करते हैं  सी (प्रोग्रामिंग भाषा)/सी++, सी शार्प (प्रोग्रामिंग भाषा)|सी#, विजुअल बेसिक .NET, जावा (प्रोग्रामिंग भाषा) जैसी प्रोग्रामिंग भाषाओं में स्टेटमेंट का उपयोग किया जाता है और यह पास्कल (प्रोग्रामिंग भाषा) जैसी अधिकांश उच्च-स्तरीय अनिवार्य प्रोग्रामिंग भाषाओं में मौजूद है।, एडा (प्रोग्रामिंग भाषा), सी (प्रोग्रामिंग भाषा)/सी++, सी शार्प (प्रोग्रामिंग भाषा)|सी#,  विजुअल बेसिक .NET, जावा (प्रोग्रामिंग भाषा),  और कई अन्य प्रकार की भाषा में, जैसे कीवर्ड (कंप्यूटर प्रोग्रामिंग) का उपयोग करना  ,  ,   या.

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

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


 * #एफ। फ़ंक्शन φ को इस प्रकार परिभाषित किया गया है
 * φ(x1, ... , एक्सn )=
 * फि1(एक्स1, ... , एक्सn ) यदि Q1(एक्स1 , ... , एक्सn ),
 * फिm(एक्स1, ... , एक्सn ) यदि Qm(एक्स1 , ... , एक्सn ),
 * फिm+1(एक्स1, ... , एक्सn ) अन्यथा,
 * फिm+1(एक्स1, ... , एक्सn ) अन्यथा,


 * कहां प्र1, ... , क्यूm परस्पर अनन्य विधेय हैं (या φ(x1 , ... , एक्सn) में पहले खंड द्वारा दिया गया मान होगा जो लागू होता है) φ में आदिम पुनरावर्ती है1, ..., फ़िm+1, क्यू1, ..., क्यूm+1.

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

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

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

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


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

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

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

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

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

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

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

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

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

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

संकलन
अनुकूलन (कंप्यूटर विज्ञान) जैसे जीएनयू कंपाइलर संग्रह या बजना मामलों में मूल्यों के माध्यम से एक स्विच स्टेटमेंट को एक शाखा तालिका या बाइनरी खोज एल्गोरिदम में संकलित कर सकता है। एक शाखा तालिका स्विच स्टेटमेंट को निर्देशों की एक छोटी, निरंतर संख्या के साथ यह निर्धारित करने की अनुमति देती है कि तुलना की सूची के बिना किस शाखा को निष्पादित करना है, जबकि एक बाइनरी खोज केवल तुलनाओं की एक लघुगणकीय संख्या लेती है, जिसे मामलों की संख्या में मापा जाता है। स्विच स्टेटमेंट.

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

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


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

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

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

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

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

पीएचपी
उदाहरण के लिए, 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.

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