सशर्त (कंप्यूटर प्रोग्रामिंग): Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
{{Short description|Control flow statement that executes code according to some condition(s)}}
{{Short description|Control flow statement that executes code according to some condition(s)}}
{{Self reference|For Wikipedia's conditional parser functions, see [[सहायता: सशर्त भाव]]}}
{{Self reference|For Wikipedia's conditional parser functions, see [[सहायता: सशर्त भाव]]}}
[[File:If-Then-Else-diagram.svg|thumb|यदि-तो-वरना प्रवाह आरेख]]
[[File:If-Then-Else-diagram.svg|thumb|यदि-then-else प्रवाह आरेख]]
[[File:IF-THEN-ELSE-END flowchart.svg|thumb|right|एक नेस्टेड If–then(–else) प्रवाह आरेख]][[कंप्यूटर विज्ञान]] में, सशर्त (अर्थात, सशर्त कथन, सशर्त अभिव्यक्ति और सशर्त निर्माण) निर्णय लेने के लिए [[प्रोग्रामिंग भाषा]] आदेश हैं। विशेष रूप से, सशर्त अलग-अलग संगणना या क्रियाएं करते हैं, जो इस बात पर निर्भर करता है कि प्रोग्रामर-परिभाषित [[बूलियन डेटाटाइप]] 'स्थिति' सही या गलत का मूल्यांकन करता है या नहीं। नियंत्रण प्रवाह के संदर्भ में, निर्णय सदैव कुछ स्थिति के आधार पर नियंत्रण प्रवाह को  वरणक्षमतापूर्वक रूप से बदलकर प्राप्त किया जाता है ([[शाखा भविष्यवाणी]] के स्थिति  के अतिरिक्त )।
[[File:IF-THEN-ELSE-END flowchart.svg|thumb|right|एक नेस्टेड If–then(–else) प्रवाह आरेख]][[कंप्यूटर विज्ञान]] में, सशर्त (अर्थात, सशर्त कथन, सशर्त अभिव्यक्ति और सशर्त निर्माण) निर्णय लेने के लिए [[प्रोग्रामिंग भाषा]] आदेश हैं। विशेष रूप से, सशर्त अलग-अलग संगणना या क्रियाएं करते हैं, जो इस बात पर निर्भर करता है कि प्रोग्रामर-परिभाषित [[बूलियन डेटाटाइप|बूलियन डेटा प्रकार]] 'स्थिति' सही या गलत का मूल्यांकन करता है या नहीं। नियंत्रण प्रवाह के संदर्भ में, निर्णय सदैव कुछ स्थिति के आधार पर नियंत्रण प्रवाह को  वरणक्षमतापूर्वक रूप से बदलकर प्राप्त किया जाता है ([[शाखा भविष्यवाणी]] के स्थिति  के अतिरिक्त )।


यद्यपि  [[गतिशील प्रेषण]] को सामान्यतः  सशर्त निर्माण के रूप में वर्गीकृत नहीं किया जाता है, यह रन टाइम (प्रोग्राम जीवनचक्र चरण) में विकल्पों के बीच चयन करने की  एक और विधि है।
यद्यपि  [[गतिशील प्रेषण]] को सामान्यतः  सशर्त निर्माण के रूप में वर्गीकृत नहीं किया जाता है, यह कार्यावधि (प्रोग्राम जीवनचक्र चरण) में विकल्पों के बीच चयन करने की  एक और विधि है।


== शब्दावली ==
== शब्दावली ==
Line 17: Line 17:
  else
  else
     (विकल्प)
     (विकल्प)
  if end
  end if


उदाहरण के लिए:
उदाहरण के लिए:
Line 25: Line 25:
  else
  else
     संदेश = स्टॉक है
     संदेश = स्टॉक है
  if end
  end if


उपरोक्त उदाहरण कोड में, ''(बूलियन स्थिति)'' द्वारा दर्शाया गया भाग एक सशर्त ''अभिव्यक्ति'' का गठन करता है, जिसमें आंतरिक मूल्य होता है (उदाहरण के लिए, इसे  <code>True</code> या <code>False</code>  मानों में से किसी एक द्वारा प्रतिस्थापित किया जा सकता है) परन्तु  इसका कोई आंतरिक अर्थ नहीं है। इसके विपरीत, इस अभिव्यक्ति का संयोजन, <code>If</code> और <code>Then</code> इसके समीप , और इसके बाद के परिणाम एक सशर्त कथन का  निर्माण करते हैं, जिसका आंतरिक अर्थ होता है (उदाहरण के लिए, एक सुसंगत तार्किक नियम व्यक्त करना) परन्तु  कोई आंतरिक मूल्य नहीं।
उपरोक्त उदाहरण कोड में, ''(बूलियन स्थिति)'' द्वारा दर्शाया गया भाग एक सशर्त ''अभिव्यक्ति'' का गठन करता है, जिसमें आंतरिक मूल्य होता है (उदाहरण के लिए, इसे  <code>True</code> या <code>False</code>  मानों में से किसी एक द्वारा प्रतिस्थापित किया जा सकता है) परन्तु  इसका कोई आंतरिक अर्थ नहीं है। इसके विपरीत, इस अभिव्यक्ति का संयोजन, <code>If</code> और <code>Then</code> इसके समीप , और इसके बाद के परिणाम एक सशर्त कथन का  निर्माण करते हैं, जिसका आंतरिक अर्थ होता है (उदाहरण के लिए, एक सुसंगत तार्किक नियम व्यक्त करना) परन्तु  कोई आंतरिक मूल्य नहीं।


जब एक [[दुभाषिया (कंप्यूटिंग)]] एक  <code>If</code> पाता है, यह एक बूलियन डेटाटाइप स्थिति की अपेक्षा करता है - उदाहरण के लिए, <code>x > 0</code>, जिसका अर्थ है कि चर x में एक संख्या है जो शून्य से अधिक है - और उस स्थिति का मूल्यांकन करता है। यदि शर्त  <code>true</code> है, निम्नलिखित कथन <code>then</code> निष्पादित किए जाते हैं। else निम्नलिखित शाखा में निष्पादन जारी रहता है - या तो <code>else</code> [[ब्लॉक (प्रोग्रामिंग)]]  में (जो सामान्यतः  वैकल्पिक होता है), या यदि  <code>else</code> शाखा नहीं है,  तो <code>end</code>के बाद<code>If</code>।
जब एक [[दुभाषिया (कंप्यूटिंग)]] एक  <code>If</code> पाता है, यह एक बूलियन डेटा प्रकार स्थिति की अपेक्षा करता है - उदाहरण के लिए, <code>x > 0</code>, जिसका अर्थ है कि चर x में एक संख्या है जो शून्य से अधिक है - और उस स्थिति का मूल्यांकन करता है। यदि शर्त  <code>true</code> है, निम्नलिखित कथन <code>then</code> निष्पादित किए जाते हैं। else निम्नलिखित शाखा में निष्पादन जारी रहता है - या तो <code>else</code> [[ब्लॉक (प्रोग्रामिंग)]]  में (जो सामान्यतः  वैकल्पिक होता है), या यदि  <code>else</code> शाखा नहीं है,  तो <code>end</code>के बाद<code>If</code>।


किसी भी शाखा के निष्पादित होने के बाद,  <code>end If</code>नियंत्रण प्रवाह बिंदु पर वापस आ जाता है।
किसी भी शाखा के निष्पादित होने के बाद,  <code>end If</code>नियंत्रण प्रवाह बिंदु पर वापस आ जाता है।


=== इतिहास और विकास ===
=== इतिहास और विकास ===
प्रारंभिक प्रोग्रामिंग भाषाओं में, विशेष रूप से 1980 के घरेलू कंप्यूटरों में [[BASIC|बेसिक]]  की कुछ बोलियाँ, एक <code>if–then</code> कथन में मात्र  <code>[[GOTO]]</code> कथन हो सकते हैं (एक शाखा (कंप्यूटर विज्ञान) निर्देश के बराबर)। इसने [[स्पेगेटी प्रोग्रामिंग]] के रूप में जानी जाने वाली प्रोग्रामिंग की एक कठिन-से-पढ़ने वाली शैली का नेतृत्व किया, इस शैली के कार्यक्रमों के साथ स्पेगेटी कोड कहा जाता है। फलस्वरूप, [[संरचित प्रोग्रामिंग]], जो (वस्तुतः)  यादृच्छिक  कथनों को एक के अंदर कथन ब्लॉक में डालने की अनुमति देती है , लोकप्रियता में प्राप्त हुआ, जब तक कि यह अधिकांश बेसिक  प्रोग्रामिंग हलकों में भी आदर्श नहीं बन गया। इस प्रकार के तंत्र और सिद्धांत प्राचीन परन्तु  अधिक उन्नत [[ALGOL|ऐल्गॉल]] भाषाओं के वर्ग पर आधारित थे, और ऐल्गॉल जैसी भाषाएँ जैसे [[पास्कल (प्रोग्रामिंग भाषा)]] और मोडुला -2 ने कई वर्षों तक आधुनिक बेसिक  प्रकार को प्रभावित किया। जबकि यह मात्र  <code>GOTO</code> प्रयोग करते हुए ही संभव है कथनों में <code>if–then</code> प्रोग्राम लिखने के लिए कथन जो स्पेगेटी कोड नहीं हैं और एक संरचित प्रोग्रामिंग भाषा में लिखे गए प्रोग्राम के रूप में अच्छी तरह से संरचित और पठनीय हैं, संरचित प्रोग्रामिंग इसे आसान बनाती है और इसे लागू करती है। स्ट्रक्चर्ड <code>if–then–else</code> उपरोक्त उदाहरण जैसे कथन संरचित प्रोग्रामिंग के प्रमुख तत्वों में से एक हैं, और वे [[सी (प्रोग्रामिंग भाषा)]], [[जावा (प्रोग्रामिंग भाषा)]], [[जावास्क्रिप्ट]] और [[मूल दृश्य]] जैसी सबसे लोकप्रिय उच्च-स्तरीय प्रोग्रामिंग भाषाओं में मौजूद हैं।
प्रारंभिक प्रोग्रामिंग भाषाओं में, विशेष रूप से 1980 के घरेलू कंप्यूटरों में [[BASIC|बेसिक]]  की कुछ बोलियाँ, एक <code>if–then</code> कथन में मात्र  <code>[[GOTO]]</code> कथन हो सकते हैं (एक शाखा (कंप्यूटर विज्ञान) निर्देश के बराबर)। इसने [[स्पेगेटी प्रोग्रामिंग]] के रूप में जानी जाने वाली प्रोग्रामिंग की एक कठिन-से-पढ़ने वाली शैली का नेतृत्व किया, इस शैली के कार्यक्रमों के साथ स्पेगेटी कोड कहा जाता है। फलस्वरूप, [[संरचित प्रोग्रामिंग]], जो (वस्तुतः)  यादृच्छिक  कथनों को एक के अंदर कथन ब्लॉक में डालने की अनुमति देती है , लोकप्रियता में प्राप्त हुआ, जब तक कि यह अधिकांश बेसिक  प्रोग्रामिंग हलकों में भी आदर्श नहीं बन गया। इस प्रकार के तंत्र और सिद्धांत प्राचीन परन्तु  अधिक उन्नत [[ALGOL|ऐल्गॉल]] भाषाओं के वर्ग पर आधारित थे, और ऐल्गॉल जैसी भाषाएँ जैसे [[पास्कल (प्रोग्रामिंग भाषा)]] और मोडुला -2 ने कई वर्षों तक आधुनिक बेसिक  प्रकार को प्रभावित किया। जबकि यह मात्र  <code>GOTO</code> प्रयोग करते हुए ही संभव है कथनों में <code>if–then</code> प्रोग्राम लिखने के लिए कथन जो स्पेगेटी कोड नहीं हैं और एक संरचित प्रोग्रामिंग भाषा में लिखे गए प्रोग्राम के रूप में ठीक प्रकार  से संरचित और पठनीय हैं, संरचित प्रोग्रामिंग इसे आसान बनाती है और इसे लागू करती है। संरचित <code>if–then–else</code> उपरोक्त उदाहरण जैसे कथन संरचित प्रोग्रामिंग के प्रमुख अवयवों में से एक हैं, और वे [[सी (प्रोग्रामिंग भाषा)]], [[जावा (प्रोग्रामिंग भाषा)]], [[जावास्क्रिप्ट]] और [[मूल दृश्य]] जैसी सबसे लोकप्रिय उच्च-स्तरीय प्रोग्रामिंग भाषाओं में स्थित हैं।


==== लटकने की समस्या ====
==== निलंबित  else की समस्या ====
{{Main|Dangling else}}
{{Main|निलंबित else}}
  <code>else</code> e> कीवर्ड एक विशिष्ट को लक्षित करने के लिए बनाया गया है <code>if–then</code> इसके पहले का कथन, परन्तु [[नेस्टिंग (कंप्यूटिंग)]] के लिए <code>if–then</code> कथन, क्लासिक प्रोग्रामिंग भाषा जैसे [[ALGOL 60|ऐल्गॉल 60]] को परिभाषित करने के लिए संघर्ष करना पड़ा कि किस विशिष्ट कथन को लक्षित किया जाए। स्पष्ट सीमाओं के बिना कौन सा कथन कौन सा है, a <code>else</code> कीवर्ड किसी भी पूर्ववर्ती को लक्षित कर सकता है <code>if–then</code> पार्स के रूप में घोंसला में कथन।
  <code>else</code>   संकेतशब्द एक विशिष्ट <code>if–then</code> को योजनाबद्ध करने के लिए बनाया गया है  इसके पूर्व  के कथन, परन्तु   [[नेस्टिंग (कंप्यूटिंग)|नीडन (कंप्यूटिंग)]] <code>if–then</code> कथनों के लिए, [[ALGOL 60|ऐल्गॉल 60]] जैसी  क्लासिक प्रोग्रामिंग भाषाओं  को परिभाषित करने के लिए प्रयत्न करना पड़ा कि किस विशिष्ट कथन को योजनाबद्ध करना है। स्पष्ट सीमाओं के बिना कौन सा कथन कौन सा है, एक <code>else</code> संकेतशब्द पार्स के रूप में नीडन में  किसी भी पूर्ववर्ती<code>if–then</code> कथन को योजनाबद्ध कर सकता है।
  if ए तो if बी तो एस और एस2
  if a then if b then s else s2
के रूप में विश्लेषित किया जा सकता है
के रूप में विश्लेषित किया जा सकता है
  if then (यदि बी तो एस) और एस 2
  if a then (if b then s) else s 2
या
या
  यदि ए तो (यदि बी तो एस और एस 2)
  if a then (if b then s else s 2)
निर्भर करता है कि क्या <code>else</code> पहले से जुड़ा है <code>if</code> या दूसरा <code>if</code>इसे [[अन्य लटक रहा है|else लटक रहा है]] समस्या के रूप में जाना जाता है, और भाषा के आधार पर (सामान्यतः  <code>end if</code> कथन या <code>{...}</code> कोष्ठक)।
इस पर निर्भर करता है कि क्या <code>else</code> पूर्व  <code>if</code> या दूसरा <code>if</code>से जुड़ा है।  इसे [[अन्य लटक रहा है|संरचित else]] समस्या के रूप में जाना जाता है, और भाषा के आधार पर विभिन्न रूपों से हल किया जाता है(सामान्यतः  <code>end if</code> कथन या <code>{...}</code> कोष्ठक के माध्यम से)।


=== वरना if ===
=== else if ===


का उपयोग करके <code>else if</code>, कई स्थितियों को जोड़ना संभव है। मात्र पहली शर्त का पालन करने वाले कथन जो सत्य पाए जाते हैं, को क्रियान्वित किया जाएगा। else सभी कथनों को छोड़ दिया जाएगा।
<code>else if</code>का उपयोग करके, कई स्थितियों को जोड़ना संभव है। मात्र प्रथम शर्त का पालन करने वाले कथन जो सत्य पाए जाते हैं, को क्रियान्वित किया जाएगा। अन्य सभी कथनों को छोड़ दिया जाएगा।


  if शर्त है तो
  if शर्त then
     ''-- कथन''
     ''-- कथन''
  else स्थिति then
  else शर्त then
     ''-- और कथन''
     ''-- else कथन''
  else स्थिति then
  else शर्त then
     ''-- और कथन;''
     ''-- और कथन;''
  ...
  ...
  else
  else
     ''-- else कथन;''
     ''-- else कथन;''
  if end;
  end if;


उदाहरण के लिए, एक दुकान के लिए जो किसी वस्तु पर 30% तक की छूट प्रदान करता है:
उदाहरण के लिए, एक दुकान के लिए जो किसी वस्तु पर 30% तक की छूट प्रदान करता है:


  if छूट <11% तो
  if छूट <11% then
     प्रिंट (आपको $30 का भुगतान करना होगा)
     प्रिंट (आपको $30 का भुगतान करना होगा)
  और छूट <21% तो
  और छूट <21% then
     प्रिंट (आपको $20 का भुगतान करना होगा)
     प्रिंट (आपको $20 का भुगतान करना होगा)
  और छूट <31% तो
  और छूट <31% then
     प्रिंट (आपको $10 का भुगतान करना होगा)
     प्रिंट (आपको $10 का भुगतान करना होगा)
  if end;
  end if;


ऊपर दिए गए उदाहरण में, यदि छूट 10% है, तो पहले यदि कथन का मूल्यांकन सत्य के रूप में किया जाएगा और आपको $30 का भुगतान करना होगा, तो उसका प्रिंट आउट ले लिया जाएगा। उस पहले यदि कथन के नीचे else सभी कथनों को छोड़ दिया जाएगा। <code>elseif</code> उदाहरण के लिए एडा (प्रोग्रामिंग लैंग्वेज) भाषा में > कथन, [[सिंटैक्टिक चीनी]] है <code>else</code> के बाद <code>if</code>. अदा में फर्क इतना ही है कि सिर्फ एक <code>end if</code> जरूरत है, if कोई उपयोग करता है <code>elseif</code> के बजाय <code>else</code> के बाद <code>if</code>। [[पीएचपी]] उपयोग करता है <code>elseif</code> कीवर्ड<ref name="php_elseif">[http://php.net/manual/control-structures.elseif.php PHP elseif सिंटैक्स] </ref> इसके कर्ली ब्रैकेट या कोलन सिंटैक्स दोनों के लिए। [[पर्ल]] कीवर्ड प्रदान करता है <code>elsif</code> बड़ी संख्या में ब्रेसिज़ से बचने के लिए जो कि एकाधिक द्वारा आवश्यक होंगे <code>if</code> और <code>else</code> कथन। पायथन (प्रोग्रामिंग लैंग्वेज) विशेष कीवर्ड का उपयोग करता है <code>elif</code> क्योंकि संरचना को ब्रेसिज़ के बजाय इंडेंटेशन द्वारा निरूपित किया जाता है, इसलिए बार-बार उपयोग किया जाता है <code>else</code> और <code>if</code> हर हालत के बाद बढ़े हुए इंडेंटेशन की आवश्यकता होगी। बेसिक के कुछ कार्यान्वयन, जैसे विज़ुअल बेसिक,<ref name="vb_elseif">[https://docs.microsoft.com/dotnet/visual-basic/language-reference/statements/if-then-else-statement Visual Basic ElseIf सिंटैक्स]</ref> उपयोग <code>ElseIf</code> बहुत। इसी प्रकार, पहले के UNIX शेल (बाद में POSIX शेल सिंटैक्स तक इकट्ठे हुए<ref name="posixshell">''[http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html POSIX standard shell syntax]''</ref>) elif का भी उपयोग करें, परन्तु  रिक्त स्थान, लाइन ब्रेक या दोनों के साथ परिसीमन का विकल्प दें।
ऊपर दिए गए उदाहरण में, यदि छूट 10% है, तो पूर्व  यदि कथन का मूल्यांकन सत्य के रूप में किया जाएगा और आपको $30 का भुगतान करना होगा, तो उसका प्रिंट आउट ले लिया जाएगा। उस पूर्व  यदि कथन के नीचे अन्य  सभी कथनों को छोड़ दिया जाएगा। उदाहरण के लिए एडा (प्रोग्रामिंग लैंग्वेज) भाषा में <code>elseif</code> कथन, [[सिंटैक्टिक चीनी]] है <code>else</code> के बाद <code>if</code>. एडा में फर्क इतना ही है कि सिर्फ एक <code>end if</code> जरूरत है, if कोई उपयोग करता है <code>elseif</code> के बजाय <code>else</code> के बाद <code>if</code>। [[पीएचपी]] उपयोग करता है <code>elseif</code> संकेतशब्द<ref name="php_elseif">[http://php.net/manual/control-structures.elseif.php PHP elseif सिंटैक्स] </ref> इसके कर्ली ब्रैकेट या कोलन सिंटैक्स दोनों के लिए। [[पर्ल]] संकेतशब्द प्रदान करता है <code>elsif</code> बड़ी संख्या में ब्रेसिज़ से बचने के लिए जो कि एकाधिक द्वारा आवश्यक होंगे <code>if</code> और <code>else</code> कथन। पायथन (प्रोग्रामिंग लैंग्वेज) विशेष संकेतशब्द का उपयोग करता है <code>elif</code> क्योंकि संरचना को ब्रेसिज़ के बजाय इंडेंटेशन द्वारा निरूपित किया जाता है, इसलिए बार-बार उपयोग किया जाता है <code>else</code> और <code>if</code> हर हालत के बाद बढ़े हुए इंडेंटेशन की आवश्यकता होगी। बेसिक के कुछ कार्यान्वयन, जैसे विज़ुअल बेसिक,<ref name="vb_elseif">[https://docs.microsoft.com/dotnet/visual-basic/language-reference/statements/if-then-else-statement Visual Basic ElseIf सिंटैक्स]</ref> उपयोग <code>ElseIf</code> बहुत। इसी प्रकार, पूर्व  के UNIX शेल (बाद में POSIX शेल सिंटैक्स तक इकट्ठे हुए<ref name="posixshell">''[http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html POSIX standard shell syntax]''</ref>) elif का भी उपयोग करें, परन्तु  रिक्त स्थान, लाइन ब्रेक या दोनों के साथ परिसीमन का विकल्प दें।


हालाँकि, कई भाषाओं में जो सीधे अल्गोल से उतरी हैं, जैसे [[सिमुला (प्रोग्रामिंग भाषा)]], पास्कल (प्रोग्रामिंग लैंग्वेज), BCPL (प्रोग्रामिंग लैंग्वेज) और C (प्रोग्रामिंग लैंग्वेज), के लिए यह विशेष सिंटैक्स <code>else if</code> निर्माण मौजूद नहीं है, न ही यह सी के कई सिंटैक्टिकल डेरिवेटिव्स में मौजूद है, जैसे कि जावा (प्रोग्रामिंग लैंग्वेज), ईसीएमएस्क्रिप्ट, और इसी प्रकार। यह काम करता है क्योंकि इन भाषाओं में, कोई एक कथन (इस स्थिति  में <code>if ''cond''</code>...) एक ब्लॉक में बंद किए बिना एक शर्त का पालन कर सकता है।
हालाँकि, कई भाषाओं में जो सीधे अल्गोल से उतरी हैं, जैसे [[सिमुला (प्रोग्रामिंग भाषा)]], पास्कल (प्रोग्रामिंग लैंग्वेज), BCPL (प्रोग्रामिंग लैंग्वेज) और C (प्रोग्रामिंग लैंग्वेज), के लिए यह विशेष सिंटैक्स <code>else if</code> निर्माण स्थित नहीं है, न ही यह सी के कई सिंटैक्टिकल डेरिवेटिव्स में स्थित है, जैसे कि जावा (प्रोग्रामिंग लैंग्वेज), ईसीएमएस्क्रिप्ट, और इसी प्रकार। यह काम करता है क्योंकि इन भाषाओं में, कोई एक कथन (इस स्थिति  में <code>if ''cond''</code>...) एक ब्लॉक में बंद किए बिना एक शर्त का पालन कर सकता है।


इस डिज़ाइन पसंद की थोड़ी लागत है। प्रत्येक <code>else if</code> शाखा प्रभावी रूप से एक अतिरिक्त नेस्टिंग स्तर जोड़ती है। यह संकलक (या जो लोग संकलक लिखते हैं) के लिए नौकरी को जटिल बनाता है, क्योंकि संकलक को मनमाने ढंग से लंबे समय तक विश्लेषण और कार्यान्वित करना चाहिए <code>else if</code> चेन रिकर्सिवली।
इस डिज़ाइन पसंद की थोड़ी लागत है। प्रत्येक <code>else if</code> शाखा प्रभावी रूप से एक अतिरिक्त नीडन स्तर जोड़ती है। यह संकलक (या जो लोग संकलक लिखते हैं) के लिए नौकरी को जटिल बनाता है, क्योंकि संकलक को मनमाने ढंग से लंबे समय तक विश्लेषण और कार्यान्वित करना चाहिए <code>else if</code> चेन रिकर्सिवली।


if कंडीशनल के अनुक्रम में सभी पद एक एक्सप्रेशन के मान का परीक्षण कर रहे हैं (उदाहरण के लिए, <code>if x=0</code> ... <code>else if x=1</code> ... <code>else if x=2</code>...), एक विकल्प [[स्विच स्टेटमेंट|स्विच कथन]] है, जिसे केस-कथन या सेलेक्ट-कथन भी कहा जाता है। इसके विपरीत, जिन भाषाओं में स्विच कथन नहीं है, उन्हें अनुक्रम द्वारा निर्मित किया जा सकता है <code>else if</code> कथन।
if कंडीशनल के अनुक्रम में सभी पद एक एक्सप्रेशन के मान का परीक्षण कर रहे हैं (उदाहरण के लिए, <code>if x=0</code> ... <code>else if x=1</code> ... <code>else if x=2</code>...), एक विकल्प [[स्विच स्टेटमेंट|स्विच कथन]] है, जिसे केस-कथन या सेलेक्ट-कथन भी कहा जाता है। इसके विपरीत, जिन भाषाओं में स्विच कथन नहीं है, उन्हें अनुक्रम द्वारा निर्मित किया जा सकता है <code>else if</code> कथन।


===if-तो-और भाव===
===if-then-और भाव===
{{See also|Statement (computer science)}}
{{See also|Statement (computer science)}}
कई भाषाएँ if एक्सप्रेशंस का समर्थन करती हैं, जो if कथन्स के समान हैं, परन्तु  परिणाम के रूप में एक मान लौटाते हैं। इस प्रकार, वे सच्ची अभिव्यक्तियाँ हैं (जो एक मूल्य का मूल्यांकन करते हैं), कथन नहीं (जो एक मूल्य के संदर्भ में अनुमति नहीं दी जा सकती है)।
कई भाषाएँ if एक्सप्रेशंस का समर्थन करती हैं, जो if कथन्स के समान हैं, परन्तु  परिणाम के रूप में एक मान लौटाते हैं। इस प्रकार, वे सच्ची अभिव्यक्तियाँ हैं (जो एक मूल्य का मूल्यांकन करते हैं), कथन नहीं (जो एक मूल्य के संदर्भ में अनुमति नहीं दी जा सकती है)।
Line 86: Line 86:
ऐल्गॉल 60 और ऐल्गॉल वर्ग के कुछ else सदस्य अनुमति देते हैं <code>if–then–else</code> एक अभिव्यक्ति के रूप में:
ऐल्गॉल 60 और ऐल्गॉल वर्ग के कुछ else सदस्य अनुमति देते हैं <code>if–then–else</code> एक अभिव्यक्ति के रूप में:
<पूर्व>
<पूर्व>
   myvariable := यदि x > 20 तो 1 else 2
   myvariable := if x > 20 then 1 else 2
</पूर्व> <!-- Don't place a semicolon at the end of the above ALGOL statement. It is NOT C. -->
</पूर्व> <!-- Don't place a semicolon at the end of the above ALGOL statement. It is NOT C. -->


Line 94: Line 94:
<वाक्यविन्यास लैंग = योजना>
<वाक्यविन्यास लैंग = योजना>
;; योजना
;; योजना
(myvariable परिभाषित करें (यदि (> x 12) 1 2)); 'x' के मान के आधार पर 'myvariable' को 1 या 2 असाइन करता है
(myvariable परिभाषित करें (if (> x 12) 1 2)); 'x' के मान के आधार पर 'myvariable' को 1 या 2 असाइन करता है
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


Line 100: Line 100:
;; सामान्य लिस्प
;; सामान्य लिस्प
(चलो ((x 10))
(चलो ((x 10))
   (setq myvariable (यदि (> x 12) 2 4))); 2 को 'myvariable' असाइन करता है
   (setq myvariable (if (> x 12) 2 4))); 2 को 'myvariable' असाइन करता है
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


Line 108: Line 108:
क्योंकि हास्केल [[आलसी मूल्यांकन]] है, नियंत्रण संरचनाओं को लिखना संभव है, जैसे कि, सामान्य अभिव्यक्ति के रूप में; आलसी मूल्यांकन का अर्थ है कि एक if फ़ंक्शन मात्र स्थिति और उचित शाखा का मूल्यांकन कर सकता है (जहाँ एक सख्त भाषा तीनों का मूल्यांकन करेगी)। इसे इस प्रकार लिखा जा सकता है:<ref name="haskell-ifthenelse-proposal">"[http://haskell.org/haskellwiki/If-then-else If-then-else Proposal on HaskellWiki]"</ref>
क्योंकि हास्केल [[आलसी मूल्यांकन]] है, नियंत्रण संरचनाओं को लिखना संभव है, जैसे कि, सामान्य अभिव्यक्ति के रूप में; आलसी मूल्यांकन का अर्थ है कि एक if फ़ंक्शन मात्र स्थिति और उचित शाखा का मूल्यांकन कर सकता है (जहाँ एक सख्त भाषा तीनों का मूल्यांकन करेगी)। इसे इस प्रकार लिखा जा सकता है:<ref name="haskell-ifthenelse-proposal">"[http://haskell.org/haskellwiki/If-then-else If-then-else Proposal on HaskellWiki]"</ref>
<वाक्यविन्यास लैंग = हैकेल>
<वाक्यविन्यास लैंग = हैकेल>
if' :: बूल -> -> -> ए
if' :: बूल -> a -> a -> ए
if' सही x _ = x
if' सही x _ = x
if' असत्य _ y = y
if' असत्य _ y = y
Line 120: Line 120:
my_variable = x > 10 ? फू : बार; // सी-जैसी भाषाओं में
my_variable = x > 10 ? फू : बार; // सी-जैसी भाषाओं में
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>
जिसकी तुलना अल्गोल-वर्ग से की जा सकती है if-तो-और भाव (एक कथन के विपरीत) (और इसी प्रकार रूबी और स्काला में, दूसरों के बीच)।
जिसकी तुलना अल्गोल-वर्ग से की जा सकती है if-then-और भाव (एक कथन के विपरीत) (और इसी प्रकार रूबी और स्काला में, दूसरों के बीच)।


if-statement का उपयोग करके इसे पूरा करने के लिए, इसमें कोड की एक से अधिक पंक्तियां होंगी (ठेठ लेआउट सम्मेलनों के तहत), और दो बार my_variable का उल्लेख करने की आवश्यकता होगी:
if-statement का उपयोग करके इसे पूरा करने के लिए, इसमें कोड की एक से अधिक पंक्तियां होंगी (ठेठ लेआउट सम्मेलनों के तहत), और दो बार my_variable का उल्लेख करने की आवश्यकता होगी:
Line 135: Line 135:
<वाक्यविन्यास लैंग = vbnet>
<वाक्यविन्यास लैंग = vbnet>
एक्स = टेक्स्टविंडो। रीडनंबर ()
एक्स = टेक्स्टविंडो। रीडनंबर ()
यदि (x > 10) then
if (x > 10) then
     TextWindow.WriteLine (मेरे चर का नाम 'फू' है।)
     TextWindow.WriteLine (मेरे चर का नाम 'फू' है।)
else
else
     TextWindow.WriteLine (मेरे चर का नाम 'बार' है।)
     TextWindow.WriteLine (मेरे चर का नाम 'बार' है।)
if end
end if
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


सबसे पहले, जब उपयोगकर्ता प्रोग्राम चलाता है, तो एक कर्सर एक नंबर टाइप करने के लिए पाठक की प्रतीक्षा करता हुआ दिखाई देता है। यदि वह संख्या 10 से अधिक है, तो टेक्स्ट My चर का नाम 'foo' रखा गया है। स्क्रीन पर प्रदर्शित होता है। यदि संख्या 10 से छोटी है, तो संदेश My Variable को 'bar' नाम दिया गया है। स्क्रीन पर छपा हुआ है।
सबसे पूर्व , जब उपयोगकर्ता प्रोग्राम चलाता है, तो एक कर्सर एक नंबर टाइप करने के लिए पाठक की प्रतीक्षा करता हुआ दिखाई देता है। यदि वह संख्या 10 से अधिक है, तो टेक्स्ट My चर का नाम 'foo' रखा गया है। स्क्रीन पर प्रदर्शित होता है। यदि संख्या 10 से छोटी है, तो संदेश My Variable को 'bar' नाम दिया गया है। स्क्रीन पर छपा हुआ है।


==== विजुअल बेसिक ====
==== विजुअल बेसिक ====
Line 148: Line 148:


==== [[टीसीएल]] ====
==== [[टीसीएल]] ====
टीसीएल में <code>if</code> एक कीवर्ड नहीं है, परन्तु  एक फ़ंक्शन है (टीसीएल में जिसे कमांड या के रूप में जाना जाता है <code>proc</code>). उदाहरण के लिए
टीसीएल में <code>if</code> एक संकेतशब्द नहीं है, परन्तु  एक फ़ंक्शन है (टीसीएल में जिसे कमांड या के रूप में जाना जाता है <code>proc</code>). उदाहरण के लिए
<वाक्यविन्यास लैंग = टीसीएल>
<वाक्यविन्यास लैंग = टीसीएल>
if {$x > 10} {
if {$x > 10} {
Line 156: Line 156:
नामक एक समारोह का आह्वान करता है <code>if</code> पासिंग 2 आर्ग्युमेंट्स: पहला कंडीशन और दूसरा ट्रू ब्रांच। दोनों तर्कों को तार के रूप में पारित किया जाता है (Tcl में घुंघराले कोष्ठक के भीतर सब कुछ एक स्ट्रिंग है)।
नामक एक समारोह का आह्वान करता है <code>if</code> पासिंग 2 आर्ग्युमेंट्स: पहला कंडीशन और दूसरा ट्रू ब्रांच। दोनों तर्कों को तार के रूप में पारित किया जाता है (Tcl में घुंघराले कोष्ठक के भीतर सब कुछ एक स्ट्रिंग है)।


उपरोक्त उदाहरण में फ़ंक्शन को कॉल करने से पहले स्थिति का मूल्यांकन नहीं किया जाता है। इसके बजाय, के कार्यान्वयन <code>if</code> फ़ंक्शन एक स्ट्रिंग मान के रूप में स्थिति प्राप्त करता है और कॉलर्स स्कोप में अभिव्यक्ति के रूप में इस स्ट्रिंग का मूल्यांकन करने के लिए ज़िम्मेदार है।<ref>{{cite web|title=New Control Structures|url=https://wiki.tcl-lang.org/page/New+Control+Structures|publisher=[[Tcler's wiki]]|access-date=August 21, 2020}}</ref>
उपरोक्त उदाहरण में फ़ंक्शन को कॉल करने से पूर्व  स्थिति का मूल्यांकन नहीं किया जाता है। इसके बजाय, के कार्यान्वयन <code>if</code> फ़ंक्शन एक स्ट्रिंग मान के रूप में स्थिति प्राप्त करता है और कॉलर्स स्कोप में अभिव्यक्ति के रूप में इस स्ट्रिंग का मूल्यांकन करने के लिए ज़िम्मेदार है।<ref>{{cite web|title=New Control Structures|url=https://wiki.tcl-lang.org/page/New+Control+Structures|publisher=[[Tcler's wiki]]|access-date=August 21, 2020}}</ref>
ऐसा व्यवहार उपयोग करने से संभव है <code>uplevel</code> और <code>expr</code> आदेश:
ऐसा व्यवहार उपयोग करने से संभव है <code>uplevel</code> और <code>expr</code> आदेश:
: Uplevel Tcl प्रक्रियाओं के रूप में नए नियंत्रण निर्माणों को लागू करना संभव बनाता है (उदाहरण के लिए, Tcl प्रक्रिया के रूप में निर्माण को लागू करने के लिए uplevel का उपयोग किया जा सकता है)।<ref>{{cite web|title=uplevel manual page|url=https://www.tcl.tk/man/tcl8.6/TclCmd/uplevel.htm|publisher=[[www.tcl.tk]]|access-date=August 21, 2020}}</ref>
: Uplevel Tcl प्रक्रियाओं के रूप में नए नियंत्रण निर्माणों को लागू करना संभव बनाता है (उदाहरण के लिए, Tcl प्रक्रिया के रूप में निर्माण को लागू करने के लिए uplevel का उपयोग किया जा सकता है)।<ref>{{cite web|title=uplevel manual page|url=https://www.tcl.tk/man/tcl8.6/TclCmd/uplevel.htm|publisher=[[www.tcl.tk]]|access-date=August 21, 2020}}</ref>
Line 164: Line 164:


==== जंग ====
==== जंग ====
जंग में (प्रोग्रामिंग भाषा), <code>if</code> सदैव एक अभिव्यक्ति है। यह जो भी शाखा निष्पादित की जाती है, या इकाई प्रकार के मूल्य का मूल्यांकन करता है <code>()</code> if कोई शाखा निष्पादित नहीं की जाती है। यदि कोई शाखा वापसी मूल्य प्रदान नहीं करती है, तो वह इसका मूल्यांकन करती है <code>()</code> डिफ़ॉल्ट रूप से। सुनिश्चित करने के लिए <code>if</code> अभिव्यक्ति का प्रकार संकलन समय पर जाना जाता है, प्रत्येक शाखा को उसी प्रकार के मान का मूल्यांकन करना चाहिए। इस कारण से, <code>else</code> शाखा प्रभावी रूप से अनिवार्य है जब तक कि else शाखाएँ इसका मूल्यांकन न करें <code>()</code>, क्योंकि <code>if</code> बिना <code>else</code> सदैव मूल्यांकन कर सकता है <code>()</code> डिफ़ॉल्ट रूप से।<ref>{{cite web|title=If and if let expressions|url=https://doc.rust-lang.org/reference/expressions/if-expr.html|access-date=November 1, 2020}}</ref>
जंग में (प्रोग्रामिंग भाषा), <code>if</code> सदैव एक अभिव्यक्ति है। यह जो भी शाखा निष्पादित की जाती है, या इकाई प्रकार के मूल्य का मूल्यांकन करता है <code>()</code> if कोई शाखा निष्पादित नहीं की जाती है। यदि कोई शाखा वापसी मूल्य प्रदान नहीं करती है, तो वह इसका मूल्यांकन करती है <code>()</code> डिफ़ॉल्ट रूप से। सुनिश्चित करने के लिए <code>if</code> अभिव्यक्ति का प्रकार संकलन समय पर जाना जाता है, प्रत्येक शाखा को उसी प्रकार के मान का मूल्यांकन करना चाहिए। इस कारण से, a <code>else</code> शाखा प्रभावी रूप से अनिवार्य है जब तक कि else शाखाएँ इसका मूल्यांकन न करें <code>()</code>, क्योंकि a <code>if</code> बिना <code>else</code> सदैव मूल्यांकन कर सकता है <code>()</code> डिफ़ॉल्ट रूप से।<ref>{{cite web|title=If and if let expressions|url=https://doc.rust-lang.org/reference/expressions/if-expr.html|access-date=November 1, 2020}}</ref>
<वाक्यविन्यास प्रकाश लैंग = जंग>
<वाक्यविन्यास प्रकाश लैंग = जंग>
// x के मान के आधार पर my_variable को कुछ मान असाइन करें
// x के मान के आधार पर my_variable को कुछ मान असाइन करें
Line 212: Line 212:


=== जावास्क्रिप्ट ===
=== जावास्क्रिप्ट ===
जावास्क्रिप्ट [[सी सिंटैक्स]] भाषाओं या समान के समान if-else कथन का उपयोग करता है। आरक्षित if कीवर्ड और बाएं कर्ली ब्रैकेट के बीच कोष्ठक के भीतर एक बूलियन मान स्वीकार किया जाता है।
जावास्क्रिप्ट [[सी सिंटैक्स]] भाषाओं या समान के समान if-else कथन का उपयोग करता है। आरक्षित if संकेतशब्द और बाएं कर्ली ब्रैकेट के बीच कोष्ठक के भीतर एक बूलियन मान स्वीकार किया जाता है।
<वाक्यविन्यास लैंग = जावास्क्रिप्ट>
<वाक्यविन्यास लैंग = जावास्क्रिप्ट>
if (गणित.यादृच्छिक () <0.5) {
if (गणित.यादृच्छिक () <0.5) {
Line 233: Line 233:


=== लैम्ब्डा कैलकुस ===
=== लैम्ब्डा कैलकुस ===
[[लैम्ब्डा कैलकुलस]] में, यदि-तो-else सशर्त की अवधारणा को अभिव्यक्तियों का उपयोग करके व्यक्त किया जा सकता है:
[[लैम्ब्डा कैलकुलस]] में, यदि-then-else सशर्त की अवधारणा को अभिव्यक्तियों का उपयोग करके व्यक्त किया जा सकता है:
  सच = λx। हाँ। एक्स
  सच = λx। हाँ। एक्स
  असत्य = λx. हाँ। वाई
  असत्य = λx. हाँ। वाई
Line 239: Line 239:
# सच दो तर्क तक लेता है और एक बार दोनों प्रदान किए जाने के बाद ([[करी]] देखें), यह दिया गया पहला तर्क देता है।
# सच दो तर्क तक लेता है और एक बार दोनों प्रदान किए जाने के बाद ([[करी]] देखें), यह दिया गया पहला तर्क देता है।
# असत्य दो तर्क तक लेता है और एक बार दोनों प्रदान किए जाने के बाद (करी देखें), यह दिया गया दूसरा तर्क देता है।
# असत्य दो तर्क तक लेता है और एक बार दोनों प्रदान किए जाने के बाद (करी देखें), यह दिया गया दूसरा तर्क देता है।
# ifThenElse तीन तर्क तक लेता है और एक बार सभी प्रदान किए जाने के बाद, यह पहले तर्क के लिए दूसरे और तीसरे तर्क दोनों को पारित करता है (जो एक ऐसा कार्य है जो दो तर्क देता है, और परिणाम उत्पन्न करता है)। हम उम्मीद करते हैं कि ifThenElse मात्र एक तर्क के रूप में सही या गलत ले, जो दोनों दिए गए दो तर्कों को उनके पसंदीदा एकल तर्क के लिए प्रोजेक्ट करते हैं, जो फिर लौटाया जाता है।
# ifThenElse तीन तर्क तक लेता है और एक बार सभी प्रदान किए जाने के बाद, यह पूर्व  तर्क के लिए दूसरे और तीसरे तर्क दोनों को पारित करता है (जो एक ऐसा कार्य है जो दो तर्क देता है, और परिणाम उत्पन्न करता है)। हम उम्मीद करते हैं कि ifThenElse मात्र एक तर्क के रूप में सही या गलत ले, जो दोनों दिए गए दो तर्कों को उनके पसंदीदा एकल तर्क के लिए प्रोजेक्ट करते हैं, जो फिर लौटाया जाता है।
ध्यान दें: ifThenElse बाएँ और दाएँ सशर्त के रूप में दो कार्य करता है; वास्तव में चुने गए फ़ंक्शन को कॉल करने के लिए ifThenElse के परिणाम के लिए एक खाली टपल () पास करना आवश्यक है, elseथा ifThenElse कॉल किए बिना फ़ंक्शन ऑब्जेक्ट को वापस कर देगा।
ध्यान दें: ifThenElse बाएँ और दाएँ सशर्त के रूप में दो कार्य करता है; वास्तव में चुने गए फ़ंक्शन को कॉल करने के लिए ifThenElse के परिणाम के लिए एक खाली टपल () पास करना आवश्यक है, elseथा ifThenElse कॉल किए बिना फ़ंक्शन ऑब्जेक्ट को वापस कर देगा।


ऐसी प्रणाली में जहां संख्याओं को परिभाषा के बिना इस्तेमाल किया जा सकता है (जैसे लिस्प, पारंपरिक पेपर गणित, आदि), उपरोक्त को नीचे एक बंद के रूप में व्यक्त किया जा सकता है:
ऐसी प्रणाली में जहां संख्याओं को परिभाषा के बिना इस्तेमाल किया जा सकता है (जैसे लिस्प, पारंपरिक पेपर गणित, आदि), उपरोक्त को नीचे एक बंद के रूप में व्यक्त किया जा सकता है:
<वाक्यविन्यास प्रकाश लैंग = लिस्प>
<वाक्यविन्यास प्रकाश लैंग = लिस्प>
  ((λसत्य। λअसत्य। λयदितोelseथा।
  ((λसत्य। λअसत्य। λयदिthenelseथा।
     (यदिफिरelseथा सत्य 2 3)
     (यदिफिरelseथा सत्य 2 3)
  )(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))
  )(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))
Line 262: Line 262:
  ) ((एक्स, वाई) => एक्स, (एक्स, वाई) => वाई, (सी, एक्स, वाई) => सी (एक्स, वाई));
  ) ((एक्स, वाई) => एक्स, (एक्स, वाई) => वाई, (सी, एक्स, वाई) => सी (एक्स, वाई));
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>
सिस्टम के बिना पहले के उदाहरण का एक और संस्करण जहां संख्याएँ ग्रहण की जाती हैं, नीचे है।
सिस्टम के बिना पूर्व  के उदाहरण का एक और संस्करण जहां संख्याएँ ग्रहण की जाती हैं, नीचे है।


पहला उदाहरण दिखाता है कि पहली शाखा ली जा रही है, जबकि दूसरा उदाहरण दिखाता है कि दूसरी शाखा ली जा रही है।
पहला उदाहरण दिखाता है कि प्रथम शाखा ली जा रही है, जबकि दूसरा उदाहरण दिखाता है कि दूसरी शाखा ली जा रही है।
<वाक्यविन्यास प्रकाश लैंग = लिस्प>
<वाक्यविन्यास प्रकाश लैंग = लिस्प>
  ((λसत्य। λअसत्य। λयदितोelseथा।
  ((λसत्य। λअसत्य। λयदिthenelseथा।
     (यदि thenelse सत्य (λFirstBranch. FirstBranch) (λSecondBranch. SecondBranch))
     (if thenelse सत्य (λFirstBranch. FirstBranch) (λSecondBranch. SecondBranch))
  )(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))
  )(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))


  ((λसत्य। λअसत्य। λयदितोelseथा।
  ((λसत्य। λअसत्य। λयदिthenelseथा।
     (ifफिरelseथा गलत (λFirstBranch. FirstBranch) (λSecondBranch. SecondBranch))
     (ifफिरelseथा गलत (λFirstBranch. FirstBranch) (λSecondBranch. SecondBranch))
  )(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))
  )(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))
Line 282: Line 282:


{{Main|Switch statement}}
{{Main|Switch statement}}
स्विच कथन (कुछ भाषाओं में, केस कथन या मल्टीवे ब्रांच) निर्दिष्ट स्थिरांक के साथ दिए गए मान की तुलना करते हैं और मैच के पहले स्थिरांक के अनुसार कार्रवाई करते हैं। यदि कोई मैच सफल नहीं होता है तो सामान्यतः  एक डिफ़ॉल्ट कार्रवाई ('else', 'elseथा') करने का प्रावधान है। स्विच कथन [[अनुकूलन संकलक]] की अनुमति दे सकते हैं, जैसे [[तालिका देखो]]। गतिशील भाषाओं में, स्थिति  निरंतर अभिव्यक्तियों तक सीमित नहीं हो सकते हैं, और पैटर्न मिलान तक विस्तारित हो सकते हैं, जैसा कि दाईं ओर [[खोल स्क्रिप्ट]] उदाहरण में है, जहां '*)' किसी भी स्ट्रिंग से मेल खाने वाली [[नियमित अभिव्यक्ति]] के रूप में डिफ़ॉल्ट केस को लागू करता है।
स्विच कथन (कुछ भाषाओं में, केस कथन या मल्टीवे ब्रांच) निर्दिष्ट स्थिरांक के साथ दिए गए मान की तुलना करते हैं और मैच के पूर्व  स्थिरांक के अनुसार कार्रवाई करते हैं। यदि कोई मैच सफल नहीं होता है तो सामान्यतः  एक डिफ़ॉल्ट कार्रवाई ('else', 'elseथा') करने का प्रावधान है। स्विच कथन [[अनुकूलन संकलक]] की अनुमति दे सकते हैं, जैसे [[तालिका देखो]]। गतिशील भाषाओं में, स्थिति  निरंतर अभिव्यक्तियों तक सीमित नहीं हो सकते हैं, और पैटर्न मिलान तक विस्तारित हो सकते हैं, जैसा कि दाईं ओर [[खोल स्क्रिप्ट]] उदाहरण में है, जहां '*)' किसी भी स्ट्रिंग से मेल खाने वाली [[नियमित अभिव्यक्ति]] के रूप में डिफ़ॉल्ट केस को लागू करता है।


{| class="wikitable"
{| class="wikitable"
Line 321: Line 321:


{{Main|Pattern matching}}
{{Main|Pattern matching}}
पैटर्न मिलान को यदि-तो-और, और केस कथन दोनों के विकल्प के रूप में देखा जा सकता है। यह कई प्रोग्रामिंग भाषाओं में कार्यात्मक प्रोग्रामिंग सुविधाओं के साथ उपलब्ध है, जैसे कि [[वोल्फ्राम भाषा]], [[एमएल (प्रोग्रामिंग भाषा)]] और कई else। यहाँ [[OCaml]] भाषा में लिखा गया एक सरल उदाहरण है:
पैटर्न मिलान को यदि-then-और, और केस कथन दोनों के विकल्प के रूप में देखा जा सकता है। यह कई प्रोग्रामिंग भाषाओं में कार्यात्मक प्रोग्रामिंग सुविधाओं के साथ उपलब्ध है, जैसे कि [[वोल्फ्राम भाषा]], [[एमएल (प्रोग्रामिंग भाषा)]] और कई else। यहाँ [[OCaml]] भाषा में लिखा गया एक सरल उदाहरण है:
<वाक्यविन्यास प्रकाश लैंग = ओकैमल>
<वाक्यविन्यास प्रकाश लैंग = ओकैमल>
फलों का मिलान करें
फलों का मिलान करें
Line 333: Line 333:
नक्शा एफ (एच: टी) = एफ एच: नक्शा एफ टी
नक्शा एफ (एच: टी) = एफ एच: नक्शा एफ टी
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>
यह कोड एक फ़ंक्शन मैप को परिभाषित करता है, जो दूसरे तर्क (एक सूची) के प्रत्येक तत्व के लिए पहला तर्क (एक फ़ंक्शन) लागू करता है, और परिणामी सूची देता है। इस स्थिति  में संभव दो प्रकार के तर्कों के लिए दो पंक्तियाँ फ़ंक्शन की दो परिभाषाएँ हैं - एक जहाँ सूची खाली है (बस एक खाली सूची लौटाएँ) और दूसरी स्थिति जहाँ सूची खाली नहीं है।
यह कोड एक फ़ंक्शन मैप को परिभाषित करता है, जो दूसरे तर्क (एक सूची) के प्रत्येक अवयव के लिए पहला तर्क (एक फ़ंक्शन) लागू करता है, और परिणामी सूची देता है। इस स्थिति  में संभव दो प्रकार के तर्कों के लिए दो पंक्तियाँ फ़ंक्शन की दो परिभाषाएँ हैं - एक जहाँ सूची खाली है (बस एक खाली सूची लौटाएँ) और दूसरी स्थिति जहाँ सूची खाली नहीं है।


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

Revision as of 14:18, 25 February 2023

यदि-then-else प्रवाह आरेख
एक नेस्टेड If–then(–else) प्रवाह आरेख

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

यद्यपि गतिशील प्रेषण को सामान्यतः सशर्त निर्माण के रूप में वर्गीकृत नहीं किया जाता है, यह कार्यावधि (प्रोग्राम जीवनचक्र चरण) में विकल्पों के बीच चयन करने की  एक और विधि है।

शब्दावली

अनिवार्य प्रोग्रामिंग भाषाओं में, सशर्त कथन (प्रोग्रामिंग) शब्द का सामान्यतः उपयोग किया जाता है, जबकि कार्यात्मक प्रोग्रामिंग में, सशर्त अभिव्यक्ति (प्रोग्रामिंग) या सशर्त निर्माण को प्राथमिकता दी जाती है, क्योंकि इन सभी शब्दों के अलग-अलग अर्थ होते हैं।

If–then(–else)

if–then ई> निर्माण (कभी-कभी कहा जाता है if–then–else) कई प्रोग्रामिंग भाषाओं में सामान्य है। यद्यपि सिंटैक्स भाषा से भाषा में भिन्न होता है, मूल संरचना (स्यूडोकोड रूप में) इस प्रकार दिखती है:
if (बूलियन स्थिति) then
   (परिणामस्वरूप)
else
   (विकल्प)
end if

उदाहरण के लिए:

if स्टॉक = 0 then
   संदेश = नया स्टॉक ऑर्डर करें
else
   संदेश = स्टॉक है
end if

उपरोक्त उदाहरण कोड में, (बूलियन स्थिति) द्वारा दर्शाया गया भाग एक सशर्त अभिव्यक्ति का गठन करता है, जिसमें आंतरिक मूल्य होता है (उदाहरण के लिए, इसे True या False मानों में से किसी एक द्वारा प्रतिस्थापित किया जा सकता है) परन्तु इसका कोई आंतरिक अर्थ नहीं है। इसके विपरीत, इस अभिव्यक्ति का संयोजन, If और Then इसके समीप , और इसके बाद के परिणाम एक सशर्त कथन का निर्माण करते हैं, जिसका आंतरिक अर्थ होता है (उदाहरण के लिए, एक सुसंगत तार्किक नियम व्यक्त करना) परन्तु कोई आंतरिक मूल्य नहीं।

जब एक दुभाषिया (कंप्यूटिंग) एक If पाता है, यह एक बूलियन डेटा प्रकार स्थिति की अपेक्षा करता है - उदाहरण के लिए, x > 0, जिसका अर्थ है कि चर x में एक संख्या है जो शून्य से अधिक है - और उस स्थिति का मूल्यांकन करता है। यदि शर्त true है, निम्नलिखित कथन then निष्पादित किए जाते हैं। else निम्नलिखित शाखा में निष्पादन जारी रहता है - या तो else ब्लॉक (प्रोग्रामिंग) में (जो सामान्यतः वैकल्पिक होता है), या यदि else शाखा नहीं है, तो endके बादIf

किसी भी शाखा के निष्पादित होने के बाद, end Ifनियंत्रण प्रवाह बिंदु पर वापस आ जाता है।

इतिहास और विकास

प्रारंभिक प्रोग्रामिंग भाषाओं में, विशेष रूप से 1980 के घरेलू कंप्यूटरों में बेसिक की कुछ बोलियाँ, एक if–then कथन में मात्र GOTO कथन हो सकते हैं (एक शाखा (कंप्यूटर विज्ञान) निर्देश के बराबर)। इसने स्पेगेटी प्रोग्रामिंग के रूप में जानी जाने वाली प्रोग्रामिंग की एक कठिन-से-पढ़ने वाली शैली का नेतृत्व किया, इस शैली के कार्यक्रमों के साथ स्पेगेटी कोड कहा जाता है। फलस्वरूप, संरचित प्रोग्रामिंग, जो (वस्तुतः) यादृच्छिक कथनों को एक के अंदर कथन ब्लॉक में डालने की अनुमति देती है , लोकप्रियता में प्राप्त हुआ, जब तक कि यह अधिकांश बेसिक प्रोग्रामिंग हलकों में भी आदर्श नहीं बन गया। इस प्रकार के तंत्र और सिद्धांत प्राचीन परन्तु अधिक उन्नत ऐल्गॉल भाषाओं के वर्ग पर आधारित थे, और ऐल्गॉल जैसी भाषाएँ जैसे पास्कल (प्रोग्रामिंग भाषा) और मोडुला -2 ने कई वर्षों तक आधुनिक बेसिक प्रकार को प्रभावित किया। जबकि यह मात्र GOTO प्रयोग करते हुए ही संभव है कथनों में if–then प्रोग्राम लिखने के लिए कथन जो स्पेगेटी कोड नहीं हैं और एक संरचित प्रोग्रामिंग भाषा में लिखे गए प्रोग्राम के रूप में ठीक प्रकार से संरचित और पठनीय हैं, संरचित प्रोग्रामिंग इसे आसान बनाती है और इसे लागू करती है। संरचित if–then–else उपरोक्त उदाहरण जैसे कथन संरचित प्रोग्रामिंग के प्रमुख अवयवों में से एक हैं, और वे सी (प्रोग्रामिंग भाषा), जावा (प्रोग्रामिंग भाषा), जावास्क्रिप्ट और मूल दृश्य जैसी सबसे लोकप्रिय उच्च-स्तरीय प्रोग्रामिंग भाषाओं में स्थित हैं।

निलंबित else की समस्या

else   संकेतशब्द एक विशिष्ट if–then को योजनाबद्ध करने के लिए बनाया गया है  इसके पूर्व  के कथन, परन्तु   नीडन (कंप्यूटिंग)  if–then कथनों के लिए,  ऐल्गॉल 60 जैसी  क्लासिक प्रोग्रामिंग भाषाओं  को परिभाषित करने के लिए  प्रयत्न करना पड़ा कि किस विशिष्ट कथन को योजनाबद्ध करना है। स्पष्ट सीमाओं के बिना कौन सा कथन कौन सा है, एक else  संकेतशब्द पार्स के रूप में नीडन में  किसी भी पूर्ववर्तीif–then कथन को योजनाबद्ध कर सकता है।
if a then if b then s else s2

के रूप में विश्लेषित किया जा सकता है

if a then (if b then s) else s 2

या

if a then (if b then s else s 2)

इस पर निर्भर करता है कि क्या else पूर्व if या दूसरा ifसे जुड़ा है। इसे संरचित else समस्या के रूप में जाना जाता है, और भाषा के आधार पर विभिन्न रूपों से हल किया जाता है(सामान्यतः end if कथन या {...} कोष्ठक के माध्यम से)।

else if

else ifका उपयोग करके, कई स्थितियों को जोड़ना संभव है। मात्र प्रथम शर्त का पालन करने वाले कथन जो सत्य पाए जाते हैं, को क्रियान्वित किया जाएगा। अन्य सभी कथनों को छोड़ दिया जाएगा।

if शर्त then
   -- कथन
else शर्त then
   -- else कथन
else शर्त then
   -- और कथन;
...
else
   -- else कथन;
end if;

उदाहरण के लिए, एक दुकान के लिए जो किसी वस्तु पर 30% तक की छूट प्रदान करता है:

if छूट <11% then
   प्रिंट (आपको $30 का भुगतान करना होगा)
और छूट <21% then
   प्रिंट (आपको $20 का भुगतान करना होगा)
और छूट <31% then
   प्रिंट (आपको $10 का भुगतान करना होगा)
end if;

ऊपर दिए गए उदाहरण में, यदि छूट 10% है, तो पूर्व यदि कथन का मूल्यांकन सत्य के रूप में किया जाएगा और आपको $30 का भुगतान करना होगा, तो उसका प्रिंट आउट ले लिया जाएगा। उस पूर्व यदि कथन के नीचे अन्य सभी कथनों को छोड़ दिया जाएगा। उदाहरण के लिए एडा (प्रोग्रामिंग लैंग्वेज) भाषा में elseif कथन, सिंटैक्टिक चीनी है else के बाद if. एडा में फर्क इतना ही है कि सिर्फ एक end if जरूरत है, if कोई उपयोग करता है elseif के बजाय else के बाद ifपीएचपी उपयोग करता है elseif संकेतशब्द[1] इसके कर्ली ब्रैकेट या कोलन सिंटैक्स दोनों के लिए। पर्ल संकेतशब्द प्रदान करता है elsif बड़ी संख्या में ब्रेसिज़ से बचने के लिए जो कि एकाधिक द्वारा आवश्यक होंगे if और else कथन। पायथन (प्रोग्रामिंग लैंग्वेज) विशेष संकेतशब्द का उपयोग करता है elif क्योंकि संरचना को ब्रेसिज़ के बजाय इंडेंटेशन द्वारा निरूपित किया जाता है, इसलिए बार-बार उपयोग किया जाता है else और if हर हालत के बाद बढ़े हुए इंडेंटेशन की आवश्यकता होगी। बेसिक के कुछ कार्यान्वयन, जैसे विज़ुअल बेसिक,[2] उपयोग ElseIf बहुत। इसी प्रकार, पूर्व के UNIX शेल (बाद में POSIX शेल सिंटैक्स तक इकट्ठे हुए[3]) elif का भी उपयोग करें, परन्तु रिक्त स्थान, लाइन ब्रेक या दोनों के साथ परिसीमन का विकल्प दें।

हालाँकि, कई भाषाओं में जो सीधे अल्गोल से उतरी हैं, जैसे सिमुला (प्रोग्रामिंग भाषा), पास्कल (प्रोग्रामिंग लैंग्वेज), BCPL (प्रोग्रामिंग लैंग्वेज) और C (प्रोग्रामिंग लैंग्वेज), के लिए यह विशेष सिंटैक्स else if निर्माण स्थित नहीं है, न ही यह सी के कई सिंटैक्टिकल डेरिवेटिव्स में स्थित है, जैसे कि जावा (प्रोग्रामिंग लैंग्वेज), ईसीएमएस्क्रिप्ट, और इसी प्रकार। यह काम करता है क्योंकि इन भाषाओं में, कोई एक कथन (इस स्थिति में if cond...) एक ब्लॉक में बंद किए बिना एक शर्त का पालन कर सकता है।

इस डिज़ाइन पसंद की थोड़ी लागत है। प्रत्येक else if शाखा प्रभावी रूप से एक अतिरिक्त नीडन स्तर जोड़ती है। यह संकलक (या जो लोग संकलक लिखते हैं) के लिए नौकरी को जटिल बनाता है, क्योंकि संकलक को मनमाने ढंग से लंबे समय तक विश्लेषण और कार्यान्वित करना चाहिए else if चेन रिकर्सिवली।

if कंडीशनल के अनुक्रम में सभी पद एक एक्सप्रेशन के मान का परीक्षण कर रहे हैं (उदाहरण के लिए, if x=0 ... else if x=1 ... else if x=2...), एक विकल्प स्विच कथन है, जिसे केस-कथन या सेलेक्ट-कथन भी कहा जाता है। इसके विपरीत, जिन भाषाओं में स्विच कथन नहीं है, उन्हें अनुक्रम द्वारा निर्मित किया जा सकता है else if कथन।

if-then-और भाव

कई भाषाएँ if एक्सप्रेशंस का समर्थन करती हैं, जो if कथन्स के समान हैं, परन्तु परिणाम के रूप में एक मान लौटाते हैं। इस प्रकार, वे सच्ची अभिव्यक्तियाँ हैं (जो एक मूल्य का मूल्यांकन करते हैं), कथन नहीं (जो एक मूल्य के संदर्भ में अनुमति नहीं दी जा सकती है)।

अल्गोल वर्ग

ऐल्गॉल 60 और ऐल्गॉल वर्ग के कुछ else सदस्य अनुमति देते हैं if–then–else एक अभिव्यक्ति के रूप में: <पूर्व>

 myvariable := if x > 20 then 1 else 2

</पूर्व>


लिस्प बोलियां

लिस्प की बोलियों में (प्रोग्रामिंग भाषा) - स्कीम (प्रोग्रामिंग लैंग्वेज), रैकेट (प्रोग्रामिंग भाषा) और सामान्य लिस्प – जिनमें से पहला ऐल्गॉल से काफी हद तक प्रेरित था: <वाक्यविन्यास लैंग = योजना>

योजना

(myvariable परिभाषित करें (if (> x 12) 1 2)); 'x' के मान के आधार पर 'myvariable' को 1 या 2 असाइन करता है </वाक्यविन्यास हाइलाइट>

<वाक्यविन्यास प्रकाश लैंग = लिस्प>

सामान्य लिस्प

(चलो ((x 10))

 (setq myvariable (if (> x 12) 2 4))); 2 को 'myvariable' असाइन करता है

</वाक्यविन्यास हाइलाइट>

हास्केल

हास्केल (प्रोग्रामिंग भाषा) 98 में, मात्र एक इफ एक्सप्रेशन है, नो इफ कथन, और else भाग अनिवार्य है, क्योंकि प्रत्येक व्यंजक का कुछ मान होना चाहिए।[4] तर्क जो else भाषाओं में सशर्त के साथ व्यक्त किया जाएगा, सामान्यतः पुनरावर्ती कार्यों में पैटर्न मिलान के साथ व्यक्त किया जाता है।

क्योंकि हास्केल आलसी मूल्यांकन है, नियंत्रण संरचनाओं को लिखना संभव है, जैसे कि, सामान्य अभिव्यक्ति के रूप में; आलसी मूल्यांकन का अर्थ है कि एक if फ़ंक्शन मात्र स्थिति और उचित शाखा का मूल्यांकन कर सकता है (जहाँ एक सख्त भाषा तीनों का मूल्यांकन करेगी)। इसे इस प्रकार लिखा जा सकता है:[5] <वाक्यविन्यास लैंग = हैकेल> if' :: बूल -> a -> a -> ए if' सही x _ = x if' असत्य _ y = y </वाक्यविन्यास हाइलाइट>

सी जैसी भाषाएं

सी (प्रोग्रामिंग लैंग्वेज) और सी-लाइक लैंग्वेज में एक विशेष टर्नरी ऑपरेटर (? condition ? evaluated-when-true : evaluated-when-false इसका अर्थ यह है कि इसे सी-जैसी भाषाओं में, if-statement के विपरीत, भावों में इनलाइन किया जा सकता है: <वाक्यविन्यास प्रकाश लैंग = सी> my_variable = x > 10 ? फू : बार; // सी-जैसी भाषाओं में </वाक्यविन्यास हाइलाइट> जिसकी तुलना अल्गोल-वर्ग से की जा सकती है if-then-और भाव (एक कथन के विपरीत) (और इसी प्रकार रूबी और स्काला में, दूसरों के बीच)।

if-statement का उपयोग करके इसे पूरा करने के लिए, इसमें कोड की एक से अधिक पंक्तियां होंगी (ठेठ लेआउट सम्मेलनों के तहत), और दो बार my_variable का उल्लेख करने की आवश्यकता होगी: <वाक्यविन्यास प्रकाश लैंग = सी> if (एक्स> 10)

   my_variable = फू;

else

   my_variable = बार;

</वाक्यविन्यास हाइलाइट>

कुछ लोगों का तर्क है कि स्पष्ट if/then कथन को पढ़ना आसान है और यह टर्नरी ऑपरेटर की तुलना में अधिक कुशल कोड के लिए संकलित हो सकता है,[6] जबकि else तर्क देते हैं कि संक्षिप्त अभिव्यक्तियों को पुनरावृत्ति वाली कई पंक्तियों में फैले कथनों की तुलना में पढ़ना आसान है।

छोटा बेसिक

<वाक्यविन्यास लैंग = vbnet> एक्स = टेक्स्टविंडो। रीडनंबर () if (x > 10) then

   TextWindow.WriteLine (मेरे चर का नाम 'फू' है।)

else

   TextWindow.WriteLine (मेरे चर का नाम 'बार' है।)

end if </वाक्यविन्यास हाइलाइट>

सबसे पूर्व , जब उपयोगकर्ता प्रोग्राम चलाता है, तो एक कर्सर एक नंबर टाइप करने के लिए पाठक की प्रतीक्षा करता हुआ दिखाई देता है। यदि वह संख्या 10 से अधिक है, तो टेक्स्ट My चर का नाम 'foo' रखा गया है। स्क्रीन पर प्रदर्शित होता है। यदि संख्या 10 से छोटी है, तो संदेश My Variable को 'bar' नाम दिया गया है। स्क्रीन पर छपा हुआ है।

विजुअल बेसिक

विज़ुअल बेसिक और कुछ else भाषाओं में, एक फ़ंक्शन कहा जाता है IIf प्रदान किया जाता है, जिसका उपयोग सशर्त अभिव्यक्ति के रूप में किया जा सकता है। यद्यपि , यह एक वास्तविक सशर्त अभिव्यक्ति की प्रकार व्यवहार नहीं करता है, क्योंकि सत्य और असत्य दोनों शाखाओं का सदैव मूल्यांकन किया जाता है; यह सिर्फ इतना है कि उनमें से एक का परिणाम फेंक दिया जाता है, जबकि दूसरे का परिणाम IIf फ़ंक्शन द्वारा वापस कर दिया जाता है।

टीसीएल

टीसीएल में if एक संकेतशब्द नहीं है, परन्तु एक फ़ंक्शन है (टीसीएल में जिसे कमांड या के रूप में जाना जाता है proc). उदाहरण के लिए <वाक्यविन्यास लैंग = टीसीएल> if {$x > 10} {

  फू डालता है!

} </वाक्यविन्यास हाइलाइट> नामक एक समारोह का आह्वान करता है if पासिंग 2 आर्ग्युमेंट्स: पहला कंडीशन और दूसरा ट्रू ब्रांच। दोनों तर्कों को तार के रूप में पारित किया जाता है (Tcl में घुंघराले कोष्ठक के भीतर सब कुछ एक स्ट्रिंग है)।

उपरोक्त उदाहरण में फ़ंक्शन को कॉल करने से पूर्व स्थिति का मूल्यांकन नहीं किया जाता है। इसके बजाय, के कार्यान्वयन if फ़ंक्शन एक स्ट्रिंग मान के रूप में स्थिति प्राप्त करता है और कॉलर्स स्कोप में अभिव्यक्ति के रूप में इस स्ट्रिंग का मूल्यांकन करने के लिए ज़िम्मेदार है।[7] ऐसा व्यवहार उपयोग करने से संभव है uplevel और expr आदेश:

Uplevel Tcl प्रक्रियाओं के रूप में नए नियंत्रण निर्माणों को लागू करना संभव बनाता है (उदाहरण के लिए, Tcl प्रक्रिया के रूप में निर्माण को लागू करने के लिए uplevel का उपयोग किया जा सकता है)।[8]

क्योंकि if वास्तव में एक कार्य है यह एक मान भी देता है:

कमांड से रिटर्न वैल्यू उस बॉडी स्क्रिप्ट का परिणाम है जिसे निष्पादित किया गया था, या एक खाली स्ट्रिंग if कोई एक्सप्रेशन नॉन-जीरो नहीं था और कोई बॉडीएन नहीं था।[9]


जंग

जंग में (प्रोग्रामिंग भाषा), if सदैव एक अभिव्यक्ति है। यह जो भी शाखा निष्पादित की जाती है, या इकाई प्रकार के मूल्य का मूल्यांकन करता है () if कोई शाखा निष्पादित नहीं की जाती है। यदि कोई शाखा वापसी मूल्य प्रदान नहीं करती है, तो वह इसका मूल्यांकन करती है () डिफ़ॉल्ट रूप से। सुनिश्चित करने के लिए if अभिव्यक्ति का प्रकार संकलन समय पर जाना जाता है, प्रत्येक शाखा को उसी प्रकार के मान का मूल्यांकन करना चाहिए। इस कारण से, a else शाखा प्रभावी रूप से अनिवार्य है जब तक कि else शाखाएँ इसका मूल्यांकन न करें (), क्योंकि a if बिना else सदैव मूल्यांकन कर सकता है () डिफ़ॉल्ट रूप से।[10] <वाक्यविन्यास प्रकाश लैंग = जंग> // x के मान के आधार पर my_variable को कुछ मान असाइन करें माना my_variable = if x > 20 {

   1

} else {

   2

};

// यह संस्करण संकलित नहीं होगा क्योंकि 1 और () के विभिन्न प्रकार हैं माना my_variable = if x > 20 {

   1

};

// जरूरत न होने पर मूल्यों को छोड़ा जा सकता है if एक्स> 20 {

   Println! (x 20 से अधिक है);

} </वाक्यविन्यास हाइलाइट>

अंकगणित if

फोरट्रान 77 तक, फोरट्रान भाषा में एक अंकगणित है if कथन जो एक गणना किए गए IF और एक केस कथन के बीच में है, जो ट्राइकोटॉमी (गणित) पर आधारित है। x < 0, x = 0, x > 0. फोरट्रान में यह सबसे पहला सशर्त कथन था:[11] <वाक्यविन्यास लैंग = फोरट्रान> if (ई) लेबल 1, लेबल 2, लेबल 3 </वाक्यविन्यास हाइलाइट>

जहां ई कोई संख्यात्मक अभिव्यक्ति है (जरूरी नहीं कि एक पूर्णांक); यह इसके बराबर है

<वाक्यविन्यास लैंग = फोरट्रान> IF (e.LT. 0) GOTO लेबल1 if (ई। ईक्यू। 0) गोटो लेबल2 गोटो लेबल3 </वाक्यविन्यास हाइलाइट>

क्योंकि यह अंकगणितीय IF एकाधिक के बराबर है GOTO कथन जो कहीं भी जा सकते हैं, इसे एक असंरचित नियंत्रण कथन माना जाता है, और यदि अधिक संरचित कथनों का उपयोग किया जा सकता है तो इसका उपयोग नहीं किया जाना चाहिए। व्यवहार में यह देखा गया है कि अधिकांश अंकगणितीय IF कथनों ने निम्नलिखित कथनों को एक या दो लेबल के साथ संदर्भित किया।

आईबीएम 704 कंप्यूटर पर फोरट्रान के मूल कार्यान्वयन में यह एकमात्र सशर्त नियंत्रण कथन था। उस कंप्यूटर पर टेस्ट-एंड-ब्रांच ऑप-कोड में उन तीन राज्यों के लिए तीन पते थे। else कंप्यूटरों में पिछले अंकगणितीय परिचालनों से जुड़े सकारात्मक, शून्य, नकारात्मक, सम, अतिप्रवाह, कैरी जैसे ध्वज रजिस्टर होंगे और 'शाखा यदि संचायक नकारात्मक' तो 'शाखा यदि संचायक शून्य' या इसी प्रकार के निर्देशों का उपयोग करेंगे। ध्यान दें कि अभिव्यक्ति का मूल्यांकन मात्र एक बार किया जाता है, और पूर्णांक अंकगणित जैसे मामलों में जहां अतिप्रवाह हो सकता है, अतिप्रवाह या कैरी फ्लैग पर भी विचार किया जाएगा।

=== स्मॉलटॉक === में वस्तु-उन्मुख कार्यान्वयन

else भाषाओं के विपरीत, स्मॉलटाक में सशर्त कथन एक भाषा निर्माण नहीं है बल्कि कक्षा में परिभाषित किया गया है Boolean एक सार विधि के रूप में जो दो पैरामीटर लेती है, क्लोजर (कंप्यूटर विज्ञान) दोनों। Boolean दो उपवर्ग हैं, True और False, जो दोनों विधि को परिभाषित करते हैं, True मात्र पहला क्लोजर निष्पादित करना, False मात्र दूसरा क्लोजर निष्पादित करना।[12] <वाक्यविन्यास लैंग = स्मॉलटॉक> वार = स्थिति

   ifTrue: ['फू']
   ifFalse: ['बार']

</वाक्यविन्यास हाइलाइट>

जावास्क्रिप्ट

जावास्क्रिप्ट सी सिंटैक्स भाषाओं या समान के समान if-else कथन का उपयोग करता है। आरक्षित if संकेतशब्द और बाएं कर्ली ब्रैकेट के बीच कोष्ठक के भीतर एक बूलियन मान स्वीकार किया जाता है। <वाक्यविन्यास लैंग = जावास्क्रिप्ट> if (गणित.यादृच्छिक () <0.5) {

 कंसोल.लॉग (आपको हेड्स मिल गए!);

} else {

 कंसोल.लॉग (आपको पूंछ मिल गई!);

} </वाक्यविन्यास हाइलाइट> उपरोक्त उदाहरण की सशर्त लेता है Math.random() < 0.5 जो आउटपुट करता है true यदि 0 और 1 के बीच एक यादृच्छिक फ़्लोट मान 0.5 से अधिक है। कथन आउटपुट के बीच बेतरतीब ढंग से चयन करने के लिए इसका उपयोग करता है You got Heads! या You got Tails! कंसोल के लिए। Else और else-if कथनों को उनके पूर्ववर्ती कथन के कर्ली ब्रैकेट के बाद जितनी बार आवश्यक हो, उतनी बार जंजीर में बांधा जा सकता है, जैसा कि नीचे दिखाया गया है: <वाक्यविन्यास लैंग = जावास्क्रिप्ट> वर एक्स = गणित यादृच्छिक (); if (एक्स <1/3) {

 कंसोल.लॉग (एक व्यक्ति जीता!);

} और if (x <2/3) {

 कंसोल.लॉग (दो लोग जीते!);

} else {

 कंसोल.लॉग (यह तीन प्रकार से टाई है!);

} </वाक्यविन्यास हाइलाइट>

लैम्ब्डा कैलकुस

लैम्ब्डा कैलकुलस में, यदि-then-else सशर्त की अवधारणा को अभिव्यक्तियों का उपयोग करके व्यक्त किया जा सकता है:

सच = λx। हाँ। एक्स
असत्य = λx. हाँ। वाई
ifTheNelse = (λc. λx. λy. (c x y))
  1. सच दो तर्क तक लेता है और एक बार दोनों प्रदान किए जाने के बाद (करी देखें), यह दिया गया पहला तर्क देता है।
  2. असत्य दो तर्क तक लेता है और एक बार दोनों प्रदान किए जाने के बाद (करी देखें), यह दिया गया दूसरा तर्क देता है।
  3. ifThenElse तीन तर्क तक लेता है और एक बार सभी प्रदान किए जाने के बाद, यह पूर्व तर्क के लिए दूसरे और तीसरे तर्क दोनों को पारित करता है (जो एक ऐसा कार्य है जो दो तर्क देता है, और परिणाम उत्पन्न करता है)। हम उम्मीद करते हैं कि ifThenElse मात्र एक तर्क के रूप में सही या गलत ले, जो दोनों दिए गए दो तर्कों को उनके पसंदीदा एकल तर्क के लिए प्रोजेक्ट करते हैं, जो फिर लौटाया जाता है।

ध्यान दें: ifThenElse बाएँ और दाएँ सशर्त के रूप में दो कार्य करता है; वास्तव में चुने गए फ़ंक्शन को कॉल करने के लिए ifThenElse के परिणाम के लिए एक खाली टपल () पास करना आवश्यक है, elseथा ifThenElse कॉल किए बिना फ़ंक्शन ऑब्जेक्ट को वापस कर देगा।

ऐसी प्रणाली में जहां संख्याओं को परिभाषा के बिना इस्तेमाल किया जा सकता है (जैसे लिस्प, पारंपरिक पेपर गणित, आदि), उपरोक्त को नीचे एक बंद के रूप में व्यक्त किया जा सकता है: <वाक्यविन्यास प्रकाश लैंग = लिस्प>

((λसत्य। λअसत्य। λयदिthenelseथा।
    (यदिफिरelseथा सत्य 2 3)
)(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))

</वाक्यविन्यास हाइलाइट> यहाँ, True, False, और ifTheNelse अपनी-अपनी परिभाषाओं से बंधे हैं जो उनके ब्लॉक के end में उनके दायरे में पारित हो जाते हैं।

इसके लिए एक कार्यशील जावास्क्रिप्ट सादृश्य (कठोरता के लिए एकल चर के मात्र कार्यों का उपयोग करके) है: <वाक्यविन्यास प्रकाश लैंग = जावास्क्रिप्ट>

वर संगणना परिणाम = ((_true => _false => _ifThenElse =>
    _ifThenelse(_true)(2)(3)
) (एक्स => वाई => एक्स) (एक्स => वाई => वाई) (सी => एक्स => वाई => सी (एक्स) (वाई)));

</वाक्यविन्यास हाइलाइट> उपरोक्त कोड बहु-परिवर्तनीय कार्यों के साथ इस प्रकार दिखता है: <वाक्यविन्यास प्रकाश लैंग = जावास्क्रिप्ट>

वर संगणना परिणाम = ((_true, _false, _ifThenElse) =>
    _ifThenelse(_true, 2, 3)
) ((एक्स, वाई) => एक्स, (एक्स, वाई) => वाई, (सी, एक्स, वाई) => सी (एक्स, वाई));

</वाक्यविन्यास हाइलाइट> सिस्टम के बिना पूर्व के उदाहरण का एक और संस्करण जहां संख्याएँ ग्रहण की जाती हैं, नीचे है।

पहला उदाहरण दिखाता है कि प्रथम शाखा ली जा रही है, जबकि दूसरा उदाहरण दिखाता है कि दूसरी शाखा ली जा रही है। <वाक्यविन्यास प्रकाश लैंग = लिस्प>

((λसत्य। λअसत्य। λयदिthenelseथा।
    (if thenelse सत्य (λFirstBranch. FirstBranch) (λSecondBranch. SecondBranch))
)(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))
((λसत्य। λअसत्य। λयदिthenelseथा।
    (ifफिरelseथा गलत (λFirstBranch. FirstBranch) (λSecondBranch. SecondBranch))
)(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))

</वाक्यविन्यास हाइलाइट> स्मॉलटाक अपने सच्चे और झूठे अभ्यावेदन के लिए एक समान विचार का उपयोग करता है, जिसमें True और False सिंगलटन ऑब्जेक्ट होते हैं जो संदेशों को ifTrue/ifFalse अलग तरीके से प्रतिक्रिया देते हैं।

हास्केल अपने बूलियन प्रकार के लिए इस सटीक मॉडल का उपयोग करता था, परन्तु लेखन के समय, अधिकांश हास्केल प्रोग्राम सिंटैक्टिक चीनी का उपयोग करते हैं यदि a तो b और c निर्माण जो ifThenelse के विपरीत नहीं होता है जब तक कि रचना नहीं करता है या तो किसी else फ़ंक्शन में लपेटा गया है या इस पृष्ठ के हास्केल अनुभाग में दिखाए गए अनुसार पुन: कार्यान्वित किया गया है।

केस और स्विच कथन

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

Pascal: C: Shell script:
case someChar of
  'a': actionOnA;
  'x': actionOnX;
  'y','z':actionOnYandZ;
  else actionOnNoMatch;
end;
switch (someChar) {
  case 'a': actionOnA; break;
  case 'x': actionOnX; break;
  case 'y':
  case 'z': actionOnYandZ; break;
  default: actionOnNoMatch;
}
case $someChar in 
   a)    actionOnA; ;;
   x)    actionOnX; ;;
   [yz]) actionOnYandZ; ;;
  *)     actionOnNoMatch  ;;
esac


पैटर्न मिलान

पैटर्न मिलान को यदि-then-और, और केस कथन दोनों के विकल्प के रूप में देखा जा सकता है। यह कई प्रोग्रामिंग भाषाओं में कार्यात्मक प्रोग्रामिंग सुविधाओं के साथ उपलब्ध है, जैसे कि वोल्फ्राम भाषा, एमएल (प्रोग्रामिंग भाषा) और कई else। यहाँ OCaml भाषा में लिखा गया एक सरल उदाहरण है: <वाक्यविन्यास प्रकाश लैंग = ओकैमल> फलों का मिलान करें | सेब -> कुक पाई | नारियल -> dango_mochi पकाएं | केला -> मिश्रण ;; </वाक्यविन्यास हाइलाइट> पैटर्न मिलान की शक्ति संक्षिप्त रूप से न मात्र क्रियाओं बल्कि मूल्यों को डेटा के पैटर्न से मिलान करने की क्षमता है। यहाँ हास्केल (प्रोग्रामिंग भाषा) में लिखा गया एक उदाहरण है जो इन दोनों विशेषताओं को दिखाता है: <वाक्यविन्यास लैंग = हैकेल> नक्शा _ [] = [] नक्शा एफ (एच: टी) = एफ एच: नक्शा एफ टी </वाक्यविन्यास हाइलाइट> यह कोड एक फ़ंक्शन मैप को परिभाषित करता है, जो दूसरे तर्क (एक सूची) के प्रत्येक अवयव के लिए पहला तर्क (एक फ़ंक्शन) लागू करता है, और परिणामी सूची देता है। इस स्थिति में संभव दो प्रकार के तर्कों के लिए दो पंक्तियाँ फ़ंक्शन की दो परिभाषाएँ हैं - एक जहाँ सूची खाली है (बस एक खाली सूची लौटाएँ) और दूसरी स्थिति जहाँ सूची खाली नहीं है।

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

हैश-आधारित सशर्त

ऐसी प्रोग्रामिंग भाषाओं में जिनमें साहचर्य सरणियाँ या तुलनीय डेटा संरचनाएँ हैं, जैसे कि पायथन (प्रोग्रामिंग भाषा), पर्ल, पीएचपी या उद्देश्य सी, सशर्त असाइनमेंट को लागू करने के लिए उनका उपयोग करना मुहावरेदार है।[13] <वाक्यविन्यास लैंग = अजगर> पालतू जानवर = इनपुट (उस पालतू जानवर का प्रकार दर्ज करें जिसे आप नाम देना चाहते हैं:) ज्ञात_पेट्स = {

    कुत्ता : फिदो,
    बिल्ली : म्याऊं,
    पक्षी : ट्वीटी,

} my_name = ज्ञात_पालतू जानवर [पालतू जानवर] </वाक्यविन्यास हाइलाइट>

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

भविष्यवाणी

सशर्त शाखा निर्देशों का एक विकल्प शाखा भविष्यवाणी है। प्रिडिक्शन एक निर्देश सेट वास्तुकला फीचर है जो कंट्रोल फ्लो को संशोधित करने के बजाय निर्देशों को सशर्त रूप से निष्पादित करने में सक्षम बनाता है।

चॉइस सिस्टम क्रॉस रेफरेंस

यह तालिका प्रत्येक भाषा के नवीनतम भाषा विनिर्देश को संदर्भित करती है। जिन भाषाओं में विनिर्देश नहीं है, उनके लिए नवीनतम आधिकारिक तौर पर जारी कार्यान्वयन को संदर्भित किया जाता है।

Programming language Structured if switch–select–case Arithmetic if Pattern matching[A]
then else else–if
Ada Yes Yes Yes Yes No No
APL No Yes Yes Yes No No
Bash shell Yes Yes Yes Yes No Yes
C, C++ No Yes unneeded[B][C] Fall-through No No
C# No Yes Unneeded[B][C] Yes No No
COBOL Yes Yes Unneeded[C] Yes No No
Eiffel Yes Yes Yes Yes No No
F# Yes Yes Yes Unneeded[D] No Yes
Fortran 90 Yes Yes Yes Yes Yes[G] No
Go No Yes Unneeded[C] Yes No No
Haskell Yes Needed Unneeded[C] Yes, but unneeded[D] No Yes
Java No Yes Unneeded[C] Fall-through[14] No No
ECMAScript (JavaScript) No Yes Unneeded[C] Fall-through[15] No No
Mathematica No Yes Yes Yes No Yes
Oberon Yes Yes Yes Yes No No
Perl No Yes Yes Yes No No
PHP No Yes Yes Fall-through No No
Pascal, Object Pascal (Delphi) Yes Yes Unneeded Yes No No
Python No Yes Yes No No Yes
Quickबेसिक Yes Yes Yes Yes No No
Ruby Yes Yes Yes Yes No Yes[H]
Rust No Yes Yes Unneeded No Yes
Scala No Yes Unneeded[C] Fall-through[citation needed] No Yes
SQL Yes[F] Yes Yes Yes[F] No No
Swift No Yes Yes Yes No Yes
Tcl No Yes Yes Yes No Yes
Visual बेसिक , classic Yes Yes Yes Yes No No
Visual बेसिक .NET Yes Yes Yes Yes No No
Windows PowerShell No Yes Yes Fall-through No No
  1. ^ This refers to pattern matching as a distinct conditional construct in the programming language – as opposed to mere string pattern matching support, such as regular expression support.
  2. 1 2 An #ELIF directive is used in the preprocessor sub-language that is used to modify the code before compilation; and to include other files.
  3. 1 2 3 4 5 6 The often-encountered else if in the C family of languages, and in COBOL and Haskell, is not a language feature but a set of nested and independent if then else statements combined with a particular source code layout. However, this also means that a distinct else–if construct is not really needed in these languages.
  4. 1 2 In Haskell and F#, a separate constant choice construct is unneeded, because the same task can be done with pattern matching.
  5. ^ In a Ruby case construct, regular expression matching is among the conditional flow-control alternatives available. For an example, see this Stack Overflow question.
  6. 1 2 SQL has two similar constructs that fulfill both roles, both introduced in SQL-92. A "searched CASE" expression CASE WHEN cond1 THEN expr1 WHEN cond2 THEN expr2 [...] ELSE exprDflt END works like if ... else if ... else, whereas a "simple CASE" expression: CASE expr WHEN val1 THEN expr1 [...] ELSE exprDflt END works like a switch statement. For details and examples see Case (SQL).
  7. ^ Arithmetic if is obsolescent in Fortran 90.
  8. ^ Pattern matching was added in Ruby 3.0.[16] Some pattern matching constructs are still experimental.


यह भी देखें

संदर्भ

  1. PHP elseif सिंटैक्स
  2. Visual Basic ElseIf सिंटैक्स
  3. POSIX standard shell syntax
  4. Haskell 98 Language and Libraries: The Revised Report
  5. "If-then-else Proposal on HaskellWiki"
  6. "Efficient C Tips #6 – Don't use the ternary operator « Stack Overflow". Embeddedgurus.com. 2009-02-18. Retrieved 2012-09-07.
  7. "New Control Structures". Tcler's wiki. Retrieved August 21, 2020.
  8. "uplevel manual page". www.tcl.tk. Retrieved August 21, 2020.
  9. "if manual page". www.tcl.tk. Retrieved August 21, 2020.
  10. "If and if let expressions". Retrieved November 1, 2020.
  11. "American National Standard Programming Language FORTRAN". 1978-04-03. Archived from the original on 2007-10-11. Retrieved 2007-09-09.
  12. "VisualWorks: Conditional Processing". 2006-12-16. Archived from the original on 2007-10-22. Retrieved 2007-09-09.
  13. "Pythonic way to implement switch/case statements". Archived from the original on 2015-01-20. Retrieved 2015-01-19.
  14. Java.sun.com, Java Language Specification, 3rd Edition.
  15. Ecma-international.org Archived 2015-04-12 at the Wayback Machine ECMAScript Language Specification, 5th Edition.
  16. "Pattern Matching". Documentation for Ruby 3.0.


बाहरी संबंध