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

From Vigyanwiki
Revision as of 13:45, 26 February 2023 by alpha>Aagman
यदि-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 उपरोक्त उदाहरण जैसे कथन संरचित प्रोग्रामिंग के प्रमुख अवयवों में से एक हैं, और वे c (प्रोग्रामिंग भाषा), जावा (प्रोग्रामिंग भाषा), जावास्क्रिप्ट और मूल दृश्य जैसी सबसे लोकप्रिय उच्च-स्तरीय प्रोग्रामिंग भाषाओं में स्थित हैं।

निलंबित 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 के बाद else के अतिरिक्त elseif उपयोग करता है। पीएचपी इसके धनु कोष्ठक या अपूर्ण विराम वाक्यविन्यास दोनों के लिए elseif संकेतशब्द उपयोग करता है।[1] पर्ल बड़ी संख्या में धनुर्कोष्ठक से बचने के लिए संकेतशब्द elsif प्रदान करता है जो कई if और else कथन के लिए आवश्यक होगा। पायथन (प्रोग्रामिंग भाषा) विशेष elif संकेतशब्द का उपयोग करता है क्योंकि संरचना को धनुर्कोष्ठक के अतिरिक्त आद्यपर्वतनी द्वारा निरूपित किया जाता है, इसलिए else और if के बार-बार उपयोग के लिए प्रत्येक स्थिति के बाद आद्यपर्वतनी में वृद्धि की आवश्यकता होगी। बेसिक के कुछ कार्यान्वयन, जैसे विज़ुअल बेसिक,[2] ElseIf का भी उपयोग करते हैं। इसी प्रकार, पूर्व के यूनिक्स शेल (बाद में पॉज़िक्स शेल वाक्यविन्यास तक इकट्ठे हुए[3]) elif का भी उपयोग करते हैं, परन्तु रिक्त स्थान, लाइन ब्रेक या दोनों के साथ परिसीमन का विकल्प देते हैं।

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

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

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

if-then-else भाव

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

अल्गोल वर्ग

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

<पूर्व>

 मायवेरिएबल  := if x > 20 then 1 else 2

</पूर्व>


लिस्प भाषिका

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

योजना

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

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

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

(चलो ((x 10))

 (setq मायवेरिएबल  (if (> x 12) 2 4))); 2 को 'मायवेरिएबल ' असाइन करता है

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

हास्केल

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

क्योंकि हास्केल मन्द मूल्यांकन है, नियंत्रण संरचनाओं को लिखना संभव है, जैसे कि, सामान्य अभिव्यक्ति के रूप में; मन्द मूल्यांकन का अर्थ है कि एक if प्रकार्य मात्र स्थिति और उचित शाखा का मूल्यांकन कर सकता है (जहाँ एक विशुद्ध भाषा तीनों का मूल्यांकन करेगी)। इसे इस प्रकार लिखा जा सकता है:[5]

<वाक्यविन्यास लैंग = हैकेल>

if' :: बूल -> a -> a -> ए if' true x _ = x

if' false _ y = y </वाक्यविन्यास हाइलाइट>

c जैसी भाषाएं

c (प्रोग्रामिंग भाषा) और c -जैसी भाषा में एक विशेष टर्नरी ऑपरेटर होता है(?:) एक प्रकार्य के साथ सशर्त अभिव्यक्ति के लिए जिसे इस प्रकार के फर्मा द्वारा वर्णित किया जा सकता है:

condition ? evaluated-when-true : evaluated-when-false

इसका अर्थ यह है कि इसे c -जैसी भाषाओं में, if-कथन के विपरीत, भावों में समरेखी किया जा सकता है:

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

माय_वेरिएबल = x > 10 ? foo : bar; // c -जैसी भाषाओं में

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

जिसकी तुलना अल्गोल-वर्ग से की जा सकती है if-then-else भाव (एक कथन के विपरीत) (और इसी प्रकार रूबी और स्काला में, दूसरों के बीच)।

if-कथन का उपयोग करके इसे पूरा करने के लिए, इसमें कोड की एक से अधिक पंक्तियां होंगी ( विशिष्ट लेआउट रूढ़ि के अंतर्गत), और दो बार माय_वेरिएबल का उल्लेख करने की आवश्यकता होगी:

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

if (x> 10)

   माय_वेरिएबल = foo;

else

   माय_वेरिएबल = bar;

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

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

छोटा बेसिक

<वाक्यविन्यास लैंग = vbnet>

x = टेक्स्टविंडो। रीडसंख्या ()

if (x > 10) then

   TextWindow.WriteLine (मेरे वेरिएबल का नाम 'foo' है।)

else

   TextWindow.WriteLine (मेरे वेरिएबल का नाम 'bar' है।)

end if

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

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

विजुअल बेसिक

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

टीसीएल

टीसीएल में if एक संकेतशब्द नहीं है, परन्तु एक प्रकार्य है (टीसीएल में जिसे proc कमांड या के रूप में जाना जाता है।) उदाहरण के लिए

<वाक्यविन्यास लैंग = टीसीएल>

if {$x > 10} {

 put foo!

}

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

2-तर्कों को अस्थायी करने वाले if नामक एक प्रकार्य का आह्वान करता है: पहली शर्त और दूसरी सच्ची शाखा। दोनों तर्कों को तार के रूप में पारित किया जाता है (टीसीएल में धनु कोष्ठक के भीतर सब कुछ एक स्ट्रिंग है)।

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

ऐसा अभ्यास uplevel और expr कमांड का उपयोग करने से संभव है:

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

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

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


रस्ट

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

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

// x के मान के आधार पर माय_वेरिएबल को कुछ मान असाइन करें

माना माय_वेरिएबल = if x > 20 {

   1

} else {

   2

};

// यह संस्करण संकलित नहीं होगा क्योंकि 1 और () के विभिन्न प्रकार हैं

माना माय_वेरिएबल = if x > 20 {

   1

};

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

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

}

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

अंकगणित if

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

<वाक्यविन्यास लैंग = फोरट्रान>

if (ई) लेबल 1, लेबल 2, लेबल 3

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

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

<वाक्यविन्यास लैंग = फोरट्रान>

IF (e.LT. 0) GOTO लेबल1

if (ई। ईक्यू। 0) गोटो लेबल2

गोटो लेबल3

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

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

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

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

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

   ifTrue: ['foo']
   ifFalse: ['bar']

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

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

जावास्क्रिप्ट c वाक्यविन्यास भाषाओं या समान के समान if-else कथन का उपयोग करता है। आरक्षित if संकेतशब्द और बाएं धनु कोष्ठक के बीच कोष्ठक के भीतर एक बूलियन मान स्वीकार किया जाता है।

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

if (गणित.यादृच्छिक () <0.5) {

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

} else {

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

}

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

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

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

वर x = गणित यादृच्छिक ();

if (x <1/3) {

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

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

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

} else {

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

}

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

लैम्ब्डा गणना

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

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

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

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

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

((λtrue। λfalse। λifthenelseथा।
    (यदिफिरelseथा true 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)
) (x => y => x) (x => y => y) ( c  => x => y => c (x) (y)));

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

उपरोक्त कोड बहु-परिवर्तनीय कार्यों के साथ इस प्रकार दिखता है:

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

वर संगणना परिणाम = ((_true, _false, _ifThenElse) =>
    _ifThenelse(_true, 2, 3)
) ((x, y) => x, (x, y) => y, ( c , x, y) => c (x, y));

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

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

प्रथम उदाहरण दिखाता है कि प्रथम शाखा ली जा रही है, जबकि दूसरा उदाहरण दिखाता है कि दूसरी शाखा ली जा रही है।

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

((λtrue। λfalse। λifthenelse
    (if thenelse true (λFirstBranch. FirstBranch) (λSecondBranch. SecondBranch))
)(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))
((λtrue। λfalse। λifthenelse
    (ifफिरelseथा false (λFirstBranch. FirstBranch) (λSecondBranch. SecondBranch))
)(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))

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

स्मॉलटाक अपने true और false अभ्यावेदन के लिए एक समान विचार का उपयोग करता है, जिसमें True और False एकल ऑब्जेक्ट होते हैं जो संदेशों को ifTrue/ifFalse अलग विधि से प्रतिक्रिया देते हैं।

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

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

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

पास्कल: C: शैल स्क्रिप्ट:
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


पैटर्न मिलान

पैटर्न मिलान को if-then-else, और कारक कथन दोनों के विकल्प के रूप में देखा जा सकता है। यह कई प्रोग्रामिंग भाषाओं में कार्यात्मक प्रोग्रामिंग सुविधाओं के साथ उपलब्ध है, जैसे कि वोल्फ्राम भाषा, एमएल (प्रोग्रामिंग भाषा) और कई else। यहाँ OCaml भाषा में लिखा गया एक सरल उदाहरण है:

<वाक्यविन्यास प्रकाश लैंग = ओकैमल> फलों का मिलान करें

| सेब -> कुक पाई | नारियल -> dango_mochi पकाएं

| केला -> मिश्रण ;;

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

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

नक्शा _ [] = []

नक्शा एफ (एच: टी) = एफ एच: नक्शा एफ टी

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

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

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

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

ऐसी प्रोग्रामिंग भाषाओं में जिनमें साहवेरिएबल्य सरणियाँ या तुलनीय डेटा संरचनाएँ हैं, जैसे कि पायथन (प्रोग्रामिंग भाषा), पर्ल, पीएचपी या उद्देश्य c , सशर्त असाइनमेंट को लागू करने के लिए उनका उपयोग करना मुहावरेदार है।[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
टीसीएल 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.


बाहरी संबंध