सशर्त (कंप्यूटर प्रोग्रामिंग)
कंप्यूटर विज्ञान में, सशर्त (अर्थात, सशर्त कथन, सशर्त अभिव्यक्ति और सशर्त निर्माण) निर्णय लेने के लिए प्रोग्रामिंग भाषा आदेश हैं। विशेष रूप से, सशर्त अलग-अलग संगणना या क्रियाएं करते हैं, जो इस बात पर निर्भर करता है कि प्रोग्रामर-परिभाषित बूलियन डेटाटाइप 'स्थिति' सही या गलत का मूल्यांकन करता है या नहीं। नियंत्रण प्रवाह के संदर्भ में, निर्णय सदैव कुछ स्थिति के आधार पर नियंत्रण प्रवाह को वरणक्षमतापूर्वक रूप से बदलकर प्राप्त किया जाता है (शाखा भविष्यवाणी के स्थिति के अतिरिक्त )।
यद्यपि गतिशील प्रेषण को सामान्यतः सशर्त निर्माण के रूप में वर्गीकृत नहीं किया जाता है, यह रन टाइम (प्रोग्राम जीवनचक्र चरण) में विकल्पों के बीच चयन करने की एक और विधि है।
शब्दावली
अनिवार्य प्रोग्रामिंग भाषाओं में, सशर्त कथन (प्रोग्रामिंग) शब्द का सामान्यतः उपयोग किया जाता है, जबकि कार्यात्मक प्रोग्रामिंग में, सशर्त अभिव्यक्ति (प्रोग्रामिंग) या सशर्त निर्माण को प्राथमिकता दी जाती है, क्योंकि इन सभी शब्दों के अलग-अलग अर्थ होते हैं।
If–then(–else)
if–then
ई> निर्माण (कभी-कभी कहा जाता हैif–then–else
) कई प्रोग्रामिंग भाषाओं में सामान्य है। यद्यपि सिंटैक्स भाषा से भाषा में भिन्न होता है, मूल संरचना (स्यूडोकोड रूप में) इस प्रकार दिखती है:
if (बूलियन स्थिति) then (परिणामस्वरूप) else (विकल्प) if end
उदाहरण के लिए:
if स्टॉक = 0 then संदेश = नया स्टॉक ऑर्डर करें else संदेश = स्टॉक है if end
उपरोक्त उदाहरण कोड में, (बूलियन स्थिति) द्वारा दर्शाया गया भाग एक सशर्त अभिव्यक्ति का गठन करता है, जिसमें आंतरिक मूल्य होता है (उदाहरण के लिए, इसे True
या False
मानों में से किसी एक द्वारा प्रतिस्थापित किया जा सकता है) परन्तु इसका कोई आंतरिक अर्थ नहीं है। इसके विपरीत, इस अभिव्यक्ति का संयोजन, If
और Then
इसके समीप , और इसके बाद के परिणाम एक सशर्त कथन का निर्माण करते हैं, जिसका आंतरिक अर्थ होता है (उदाहरण के लिए, एक सुसंगत तार्किक नियम व्यक्त करना) परन्तु कोई आंतरिक मूल्य नहीं।
जब एक दुभाषिया (कंप्यूटिंग) एक If
पाता है, यह एक बूलियन डेटाटाइप स्थिति की अपेक्षा करता है - उदाहरण के लिए, x > 0
, जिसका अर्थ है कि चर x में एक संख्या है जो शून्य से अधिक है - और उस स्थिति का मूल्यांकन करता है। यदि शर्त true
है, निम्नलिखित कथन then
निष्पादित किए जाते हैं। elseथा, निम्नलिखित शाखा में निष्पादन जारी रहता है - या तो else
ब्लॉक (प्रोग्रामिंग) में (जो सामान्यतः वैकल्पिक होता है), या यदि else
शाखा नहीं है, तो end
के बादIf
।
किसी भी शाखा के निष्पादित होने के बाद, end If
नियंत्रण प्रवाह बिंदु पर वापस आ जाता है।
इतिहास और विकास
प्रारंभिक प्रोग्रामिंग भाषाओं में, विशेष रूप से 1980 के घरेलू कंप्यूटरों में BASIC की कुछ बोलियाँ, एक if–then
कथन में मात्र GOTO
कथन कथन हो सकते हैं (एक शाखा (कंप्यूटर विज्ञान) निर्देश के बराबर)। इसने स्पेगेटी प्रोग्रामिंग के रूप में जानी जाने वाली प्रोग्रामिंग की एक कठिन-से-पढ़ने वाली शैली का नेतृत्व किया, इस शैली के कार्यक्रमों के साथ स्पेगेटी कोड कहा जाता है। नतीजतन, संरचित प्रोग्रामिंग, जो (वस्तुतः) मनमाना कथनों को एक के अंदर स्टेटमेंट ब्लॉक में डालने की अनुमति देती है if
कथन, लोकप्रियता में प्राप्त हुआ, जब तक कि यह अधिकांश बुनियादी प्रोग्रामिंग सर्किलों में भी आदर्श नहीं बन गया। इस प्रकार के तंत्र और सिद्धांत पुराने परन्तु अधिक उन्नत ALGOL भाषाओं के परिवार पर आधारित थे, और ALGOL जैसी भाषाएँ जैसे पास्कल (प्रोग्रामिंग भाषा) और मोडुला -2 ने कई वर्षों तक आधुनिक BASIC वेरिएंट को प्रभावित किया। जबकि यह मात्र प्रयोग करते हुए ही संभव है GOTO
कथनों में if–then
प्रोग्राम लिखने के लिए कथन जो स्पेगेटी कोड नहीं हैं और एक संरचित प्रोग्रामिंग भाषा में लिखे गए प्रोग्राम के रूप में अच्छी तरह से संरचित और पठनीय हैं, संरचित प्रोग्रामिंग इसे आसान बनाती है और इसे लागू करती है। स्ट्रक्चर्ड if–then–else
उपरोक्त उदाहरण जैसे कथन संरचित प्रोग्रामिंग के प्रमुख तत्वों में से एक हैं, और वे सी (प्रोग्रामिंग भाषा), जावा (प्रोग्रामिंग भाषा), जावास्क्रिप्ट और मूल दृश्य जैसी सबसे लोकप्रिय उच्च-स्तरीय प्रोग्रामिंग भाषाओं में मौजूद हैं।
लटकने की समस्या
else
e> कीवर्ड एक विशिष्ट को लक्षित करने के लिए बनाया गया हैif–then
इसके पहले का कथन, परन्तु नेस्टिंग (कंप्यूटिंग) के लिएif–then
कथन, क्लासिक प्रोग्रामिंग भाषा जैसे ALGOL 60 को परिभाषित करने के लिए संघर्ष करना पड़ा कि किस विशिष्ट कथन को लक्षित किया जाए। स्पष्ट सीमाओं के बिना कौन सा कथन कौन सा है, aelse
कीवर्ड किसी भी पूर्ववर्ती को लक्षित कर सकता हैif–then
पार्स के रूप में घोंसला में कथन। if ए तो if बी तो एस और एस2
के रूप में विश्लेषित किया जा सकता है
if ए then (यदि बी तो एस) और एस 2
या
यदि ए तो (यदि बी तो एस और एस 2)
निर्भर करता है कि क्या else
पहले से जुड़ा है if
या दूसरा if
। इसे else लटक रहा है समस्या के रूप में जाना जाता है, और भाषा के आधार पर (सामान्यतः end if
कथन या {...}
कोष्ठक)।
वरना if
का उपयोग करके else if
, कई स्थितियों को जोड़ना संभव है। मात्र पहली शर्त का पालन करने वाले कथन जो सत्य पाए जाते हैं, को क्रियान्वित किया जाएगा। else सभी कथनों को छोड़ दिया जाएगा।
if शर्त है तो -- कथन else स्थिति then -- और कथन else स्थिति then -- और कथन; ... else -- else कथन; if end;
उदाहरण के लिए, एक दुकान के लिए जो किसी वस्तु पर 30% तक की छूट प्रदान करता है:
if छूट <11% तो प्रिंट (आपको $30 का भुगतान करना होगा) और छूट <21% तो प्रिंट (आपको $20 का भुगतान करना होगा) और छूट <31% तो प्रिंट (आपको $10 का भुगतान करना होगा) if end;
ऊपर दिए गए उदाहरण में, यदि छूट 10% है, तो पहले यदि कथन का मूल्यांकन सत्य के रूप में किया जाएगा और आपको $30 का भुगतान करना होगा, तो उसका प्रिंट आउट ले लिया जाएगा। उस पहले यदि कथन के नीचे else सभी कथनों को छोड़ दिया जाएगा। 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-तो-और भाव
कई भाषाएँ if एक्सप्रेशंस का समर्थन करती हैं, जो if स्टेटमेंट्स के समान हैं, परन्तु परिणाम के रूप में एक मान लौटाते हैं। इस प्रकार, वे सच्ची अभिव्यक्तियाँ हैं (जो एक मूल्य का मूल्यांकन करते हैं), कथन नहीं (जो एक मूल्य के संदर्भ में अनुमति नहीं दी जा सकती है)।
अल्गोल परिवार
ALGOL 60 और ALGOL परिवार के कुछ else सदस्य अनुमति देते हैं if–then–else
एक अभिव्यक्ति के रूप में:
<पूर्व>
myvariable := यदि x > 20 तो 1 else 2
</पूर्व>
लिस्प बोलियां
लिस्प की बोलियों में (प्रोग्रामिंग भाषा) - स्कीम (प्रोग्रामिंग लैंग्वेज), रैकेट (प्रोग्रामिंग भाषा) और सामान्य लिस्प – जिनमें से पहला ALGOL से काफी हद तक प्रेरित था: <वाक्यविन्यास लैंग = योजना>
- योजना
(myvariable परिभाषित करें (यदि (> x 12) 1 2)); 'x' के मान के आधार पर 'myvariable' को 1 या 2 असाइन करता है </वाक्यविन्यास हाइलाइट>
<वाक्यविन्यास प्रकाश लैंग = लिस्प>
- सामान्य लिस्प
(चलो ((x 10))
(setq myvariable (यदि (> x 12) 2 4))); 2 को 'myvariable' असाइन करता है
</वाक्यविन्यास हाइलाइट>
हास्केल
हास्केल (प्रोग्रामिंग भाषा) 98 में, मात्र एक इफ एक्सप्रेशन है, नो इफ स्टेटमेंट, और else
भाग अनिवार्य है, क्योंकि प्रत्येक व्यंजक का कुछ मान होना चाहिए।[4] तर्क जो else भाषाओं में सशर्त के साथ व्यक्त किया जाएगा, सामान्यतः पुनरावर्ती कार्यों में पैटर्न मिलान के साथ व्यक्त किया जाता है।
क्योंकि हास्केल आलसी मूल्यांकन है, नियंत्रण संरचनाओं को लिखना संभव है, जैसे कि, सामान्य अभिव्यक्ति के रूप में; आलसी मूल्यांकन का अर्थ है कि एक if फ़ंक्शन मात्र स्थिति और उचित शाखा का मूल्यांकन कर सकता है (जहाँ एक सख्त भाषा तीनों का मूल्यांकन करेगी)। इसे इस प्रकार लिखा जा सकता है:[5] <वाक्यविन्यास लैंग = हैकेल> if' :: बूल -> ए -> ए -> ए if' सही x _ = x if' असत्य _ y = y </वाक्यविन्यास हाइलाइट>
सी जैसी भाषाएं
सी (प्रोग्रामिंग लैंग्वेज) और सी-लाइक लैंग्वेज में एक विशेष टर्नरी ऑपरेटर (?
condition ? evaluated-when-true : evaluated-when-false
इसका अर्थ यह है कि इसे सी-जैसी भाषाओं में, if-statement के विपरीत, भावों में इनलाइन किया जा सकता है:
<वाक्यविन्यास प्रकाश लैंग = सी>
my_variable = x > 10 ? फू : बार; // सी-जैसी भाषाओं में
</वाक्यविन्यास हाइलाइट>
जिसकी तुलना अल्गोल-परिवार से की जा सकती है if-तो-और भाव (एक कथन के विपरीत) (और इसी प्रकार रूबी और स्काला में, दूसरों के बीच)।
if-statement का उपयोग करके इसे पूरा करने के लिए, इसमें कोड की एक से अधिक पंक्तियां होंगी (ठेठ लेआउट सम्मेलनों के तहत), और दो बार my_variable का उल्लेख करने की आवश्यकता होगी: <वाक्यविन्यास प्रकाश लैंग = सी> if (एक्स> 10)
my_variable = फू;
else
my_variable = बार;
</वाक्यविन्यास हाइलाइट>
कुछ लोगों का तर्क है कि स्पष्ट if/then स्टेटमेंट को पढ़ना आसान है और यह टर्नरी ऑपरेटर की तुलना में अधिक कुशल कोड के लिए संकलित हो सकता है,[6] जबकि else तर्क देते हैं कि संक्षिप्त अभिव्यक्तियों को पुनरावृत्ति वाली कई पंक्तियों में फैले कथनों की तुलना में पढ़ना आसान है।
छोटा बेसिक
<वाक्यविन्यास लैंग = vbnet> एक्स = टेक्स्टविंडो। रीडनंबर () यदि (x > 10) then
TextWindow.WriteLine (मेरे चर का नाम 'फू' है।)
else
TextWindow.WriteLine (मेरे चर का नाम 'बार' है।)
if end </वाक्यविन्यास हाइलाइट>
सबसे पहले, जब उपयोगकर्ता प्रोग्राम चलाता है, तो एक कर्सर एक नंबर टाइप करने के लिए पाठक की प्रतीक्षा करता हुआ दिखाई देता है। यदि वह संख्या 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
अभिव्यक्ति का प्रकार संकलन समय पर जाना जाता है, प्रत्येक शाखा को उसी प्रकार के मान का मूल्यांकन करना चाहिए। इस कारण से, ए else
शाखा प्रभावी रूप से अनिवार्य है जब तक कि else शाखाएँ इसका मूल्यांकन न करें ()
, क्योंकि ए 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 {
कंसोल.लॉग (यह तीन प्रकार से टाई है!);
} </वाक्यविन्यास हाइलाइट>
लैम्ब्डा कैलकुस
लैम्ब्डा कैलकुलस में, यदि-तो-else सशर्त की अवधारणा को अभिव्यक्तियों का उपयोग करके व्यक्त किया जा सकता है:
सच = λx। हाँ। एक्स असत्य = λx. हाँ। वाई ifTheNelse = (λc. λx. λy. (c x y))
- सच दो तर्क तक लेता है और एक बार दोनों प्रदान किए जाने के बाद (करी देखें), यह दिया गया पहला तर्क देता है।
- असत्य दो तर्क तक लेता है और एक बार दोनों प्रदान किए जाने के बाद (करी देखें), यह दिया गया दूसरा तर्क देता है।
- ifThenElse तीन तर्क तक लेता है और एक बार सभी प्रदान किए जाने के बाद, यह पहले तर्क के लिए दूसरे और तीसरे तर्क दोनों को पारित करता है (जो एक ऐसा कार्य है जो दो तर्क देता है, और परिणाम उत्पन्न करता है)। हम उम्मीद करते हैं कि ifThenElse मात्र एक तर्क के रूप में सही या गलत ले, जो दोनों दिए गए दो तर्कों को उनके पसंदीदा एकल तर्क के लिए प्रोजेक्ट करते हैं, जो फिर लौटाया जाता है।
ध्यान दें: ifThenElse बाएँ और दाएँ सशर्त के रूप में दो कार्य करता है; वास्तव में चुने गए फ़ंक्शन को कॉल करने के लिए ifThenElse के परिणाम के लिए एक खाली टपल () पास करना आवश्यक है, elseथा ifThenElse कॉल किए बिना फ़ंक्शन ऑब्जेक्ट को वापस कर देगा।
ऐसी प्रणाली में जहां संख्याओं को परिभाषा के बिना इस्तेमाल किया जा सकता है (जैसे लिस्प, पारंपरिक पेपर गणित, आदि), उपरोक्त को नीचे एक बंद के रूप में व्यक्त किया जा सकता है: <वाक्यविन्यास प्रकाश लैंग = लिस्प>
((λसत्य। λअसत्य। λयदितोelseथा। (यदिफिर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) ) ((एक्स, वाई) => एक्स, (एक्स, वाई) => वाई, (सी, एक्स, वाई) => सी (एक्स, वाई));
</वाक्यविन्यास हाइलाइट> सिस्टम के बिना पहले के उदाहरण का एक और संस्करण जहां संख्याएँ ग्रहण की जाती हैं, नीचे है।
पहला उदाहरण दिखाता है कि पहली शाखा ली जा रही है, जबकि दूसरा उदाहरण दिखाता है कि दूसरी शाखा ली जा रही है। <वाक्यविन्यास प्रकाश लैंग = लिस्प>
((λसत्य। λअसत्य। λयदितोelseथा। (यदि thenelse सत्य (λFirstBranch. FirstBranch) (λSecondBranch. SecondBranch)) )(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))
((λसत्य। λअसत्य। λयदितोelseथा। (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
|
पैटर्न मिलान
पैटर्न मिलान को यदि-तो-और, और केस स्टेटमेंट दोनों के विकल्प के रूप में देखा जा सकता है। यह कई प्रोग्रामिंग भाषाओं में कार्यात्मक प्रोग्रामिंग सुविधाओं के साथ उपलब्ध है, जैसे कि वोल्फ्राम भाषा, एमएल (प्रोग्रामिंग भाषा) और कई 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 |
QuickBASIC | 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 Basic, classic | Yes | Yes | Yes | Yes | No | No |
Visual Basic .NET | Yes | Yes | Yes | Yes | No | No |
Windows PowerShell | No | Yes | Yes | Fall-through | No | No |
- ^ 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.
- 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.
- 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. - 1 2 In Haskell and F#, a separate constant choice construct is unneeded, because the same task can be done with pattern matching.
- ^ In a Ruby
case
construct, regular expression matching is among the conditional flow-control alternatives available. For an example, see this Stack Overflow question. - 1 2 SQL has two similar constructs that fulfill both roles, both introduced in SQL-92. A "searched
CASE
" expressionCASE WHEN cond1 THEN expr1 WHEN cond2 THEN expr2 [...] ELSE exprDflt END
works likeif ... else if ... else
, whereas a "simpleCASE
" expression:CASE expr WHEN val1 THEN expr1 [...] ELSE exprDflt END
works like a switch statement. For details and examples see Case (SQL). - ^ Arithmetic
if
is obsolescent in Fortran 90. - ^ Pattern matching was added in Ruby 3.0.[16] Some pattern matching constructs are still experimental.
यह भी देखें
- शाखा (कंप्यूटर विज्ञान)
- सशर्त संकलन
- निष्पादन विकल्प बनाने के दूसरे तरीके के लिए गतिशील प्रेषण
- इतिहास और ऐतिहासिक संदर्भों के लिए मैकार्थी औपचारिकतावाद
- नामित स्थिति
- रिलेशनल ऑपरेटर
- टेस्ट (यूनिक्स)
- योदा की स्थिति
- सशर्त चाल
संदर्भ
- ↑ PHP elseif सिंटैक्स
- ↑ Visual Basic ElseIf सिंटैक्स
- ↑ POSIX standard shell syntax
- ↑ Haskell 98 Language and Libraries: The Revised Report
- ↑ "If-then-else Proposal on HaskellWiki"
- ↑ "Efficient C Tips #6 – Don't use the ternary operator « Stack Overflow". Embeddedgurus.com. 2009-02-18. Retrieved 2012-09-07.
- ↑ "New Control Structures". Tcler's wiki. Retrieved August 21, 2020.
- ↑ "uplevel manual page". www.tcl.tk. Retrieved August 21, 2020.
- ↑ "if manual page". www.tcl.tk. Retrieved August 21, 2020.
- ↑ "If and if let expressions". Retrieved November 1, 2020.
- ↑ "American National Standard Programming Language FORTRAN". 1978-04-03. Archived from the original on 2007-10-11. Retrieved 2007-09-09.
- ↑ "VisualWorks: Conditional Processing". 2006-12-16. Archived from the original on 2007-10-22. Retrieved 2007-09-09.
- ↑ "Pythonic way to implement switch/case statements". Archived from the original on 2015-01-20. Retrieved 2015-01-19.
- ↑ Java.sun.com, Java Language Specification, 3rd Edition.
- ↑ Ecma-international.org Archived 2015-04-12 at the Wayback Machine ECMAScript Language Specification, 5th Edition.
- ↑ "Pattern Matching". Documentation for Ruby 3.0.
बाहरी संबंध
- Media related to सशर्त (कंप्यूटर प्रोग्रामिंग) at Wikimedia Commons
- IF NOT (ActionScript 3.0) video