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

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

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

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

शब्दावली

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

If–then(–else)

कई प्रोग्रामिंग भाषाओं में if–then निर्माण (कभी-कभी if–then–else कहा जाता है ) सामान्य है। यद्यपि वाक्यविन्यास भाषा से भाषा में भिन्न होता है, मूल संरचना(स्यूडोकोड रूप में) इस प्रकार दिखती है:
If (boolean condition) Then
   (consequent)
Else
   (alternative)
End If

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

If stock=0 Then

   message= order new stock
Else
   message= there is stock
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 s2

या

if a then (if b then s else s2)

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

else if

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

if condition then
   -- statements
elseif condition then
   -- more statements
elseif condition then
   -- more statements;
...
else
   -- other statements;
end if;

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

if discount < 11% then
   print (you have to pay $30)
elseif discount<21% then
   print (you have to pay $20)
elseif discount<31% then
   print (you have to pay $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 को अभिव्यक्ति के रूप में अनुमति देते हैं:

  myvariable := if x > 20 then 1 else 2

लिस्प भाषिका

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

;; Scheme
(define myvariable (if (> x 12) 1 2))   ; Assigns 'myvariable' to 1 or 2, depending on the value of 'x'
;; Common Lisp
(let ((x 10))
  (setq myvariable (if (> x 12) 2 4)))  ; Assigns 'myvariable' to 2

हास्केल

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

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

if' :: Bool -> a -> a -> a
if' True x _ = x
if' False _ y = y

c जैसी भाषाएं

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

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

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

my_variable = x > 10 ? "foo" : "bar";  // In C-like languages

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

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

if (x > 10)
    my_variable = "foo";
else
    my_variable = "bar";

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

छोटा बेसिक

x = TextWindow.ReadNumber()
If (x > 10) Then
    TextWindow.WriteLine("My variable is named 'foo'.")
Else
    TextWindow.WriteLine("My variable is named 'bar'.")
EndIf

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

विजुअल बेसिक

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

टीसीएल

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

if {$x > 10} {
   puts "Foo!"
}

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

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

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

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

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

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


रस्ट

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

// Assign my_variable some value, depending on the value of x
let my_variable = if x > 20 {
    1
} else {
    2
};

// This variant will not compile because 1 and () have different types
let my_variable = if x > 20 {
    1
};

// Values can be omitted when not needed
if x > 20 {
    println!("x is greater than 20");
}

अंकगणित if

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

IF (e) label1, label2, label3

Where e is any numeric expression (not necessarily an integer); this is equivalent to

IF (e .LT. 0) GOTO label1
IF (e .EQ. 0) GOTO label2
GOTO label3

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

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

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

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

var = condition 
    ifTrue: [ 'foo' ]
    ifFalse: [ 'bar' ]

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

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

if (Math.random() < 0.5) {
  console.log("You got Heads!");
} else {
  console.log("You got Tails!");
}

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

var x = Math.random();
if (x < 1/3) {
  console.log("One person won!");
} else if (x < 2/3) {
  console.log("Two people won!");
} else {
  console.log("It's a three-way tie!");
}

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

लैम्ब्डा गणना में, यदि-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.
     (ifThenElse true 2 3)
 )(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))

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

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

 var computationResult = ((_true => _false => _ifThenElse => 
     _ifThenElse(_true)(2)(3) 
 )(x => y => x)(x => y => y)(c => x => y => c(x)(y)));

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

 var computationResult = ((_true, _false, _ifThenElse) =>
     _ifThenElse(_true, 2, 3)
 )((x, y) => x, (x, y) => y, (c, x, y) => c(x, y));

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

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

 ((λtrue. λfalse. λifThenElse.
     (ifThenElse true (λFirstBranch. FirstBranch) (λSecondBranch. SecondBranch))
 )(λx. λy. x)(λx. λy. y)(λc. λl. λr. c l r))

 ((λtrue. λfalse. λifThenElse.
     (ifThenElse 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', 'otherwise') करने का प्रावधान है। स्विच कथन अनुकूलन संकलक की अनुमति दे सकते हैं, जैसे लुकअप तालिका । गतिशील भाषाओं में, स्थिति निरंतर अभिव्यक्तियों तक सीमित नहीं हो सकते हैं, और पैटर्न मिलान तक विस्तारित हो सकते हैं, जैसा कि दाईं ओर शैल स्क्रिप्ट उदाहरण में है, जहां '*)' किसी भी स्ट्रिंग से मेल खाने वाली नियमित अभिव्यक्ति के रूप में डिफ़ॉल्ट कारक को लागू करता है।

पास्कल: 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 भाषा में लिखा गया एक सरल उदाहरण है:

match fruit with
| "apple" -> cook pie
| "coconut" -> cook dango_mochi
| "banana" -> mix;;

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

map _ []      = []
map f (h : t) = f h : map f t

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

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

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

ऐसी प्रोग्रामिंग भाषाओं में जिनमें साहचर्य सरणियाँ या तुलनीय डेटा संरचनाएँ हैं, जैसे कि पायथन(प्रोग्रामिंग भाषा), पर्ल, पीएचपी या ऑब्जेक्टिव c, सशर्त असाइनमेंट को लागू करने के लिए उनका उपयोग करना सिद्धप्रयोग है।[13]

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

pet = input("Enter the type of pet you want to name: ")

known_pets = {

 "Dog": "Fido",
 "Cat": "Meowsles",
 "Bird": "Tweety",

}

my_name = known_pets[pet]

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

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

कथन

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

चयन प्रणाली प्रति संदर्भ

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

प्रोग्रामिंग भाषा संरचित if स्विच–चयन– कारक अंकगणित if पैटर्न मिलान[A]
then else else–if
ऐडा Yes Yes Yes Yes No No
एपीएल No Yes Yes Yes No No
बैश शैल 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
कोबोल Yes Yes Unneeded[C] Yes No No
एफिल Yes Yes Yes Yes No No
F# Yes Yes Yes Unneeded[D] No Yes
फोरट्रान90 Yes Yes Yes Yes Yes[G] No
गो No Yes Unneeded[C] Yes No No
हास्केल Yes Needed Unneeded[C] Yes, but unneeded[D] No Yes
जावा No Yes Unneeded[C] Fall-through[14] No No
ईसीएमएस्क्रिप्ट(जावास्क्रिप्ट) No Yes Unneeded[C] Fall-through[15] No No
मेथेमेटिका No Yes Yes Yes No Yes
ओबेरोन Yes Yes Yes Yes No No
पर्ल No Yes Yes Yes No No
पीएचपी No Yes Yes Fall-through No No
पास्कल, ऑब्जेक्ट पास्कल(डेल्फी) Yes Yes Unneeded Yes No No
पाइथन No Yes Yes No No Yes
क्वीकबेसिक Yes Yes Yes Yes No No
रूबी Yes Yes Yes Yes No Yes[H]
रस्ट No Yes Yes Unneeded No Yes
स्काला No Yes Unneeded[C] Fall-through[citation needed] No Yes
एसक्यूएल Yes[F] Yes Yes Yes[F] No No
स्विफ्ट No Yes Yes Yes No Yes
टीसीएल No Yes Yes Yes No Yes
विज़ुअल बेसिक, क्लासिक Yes Yes Yes Yes No No
विज़ुअल बेसिक .NET Yes Yes Yes Yes No No
विंडोज पॉवरशेल No Yes Yes Fall-through No No
  1. ^ यह पैटर्न मिलान को प्रोग्रामिंग भाषा में एक विशिष्ट सशर्त निर्माण के रूप में संदर्भित करता है - मात्र स्ट्रिंग पैटर्न मिलान समर्थन के विपरीत, जैसे नियमित अभिव्यक्ति समर्थन।
  2. 1 2 प्रीप्रोसेसर उप-भाषा में एक #ELIF निर्देश का उपयोग किया जाता है जिसका उपयोग संकलन से पहले कोड को संशोधित करने के लिए किया जाता है; और सम्मिलित करें अन्य फाइलें।
  3. 1 2 3 4 5 6 भाषाओं के C परिवार में, और कोबोल और हास्केल में प्रायः सामना किया जाने वाला else if, एक भाषा विशेषता नहीं है, परन्तु एक विशेष के साथ संयुक्त और स्वतंत्र if if else कथनों का एक सेट है स्रोत कोड लेआउट। यद्यपि, इसका अर्थ यह भी है कि इन भाषाओं में एक अलग else-if निर्माण की निश्चित आवश्यकता नहीं है।
  4. 1 2 हास्केल और F# में, एक अलग स्थिर विकल्प निर्माण अनावश्यक है, क्योंकि वही कार्य पैटर्न मिलान के साथ किया जा सकता है।
  5. ^ रूबी <कोड>केस</कोड> निर्माण में, रेगुलर एक्सप्रेशन मिलान उपलब्ध सशर्त प्रवाह-नियंत्रण विकल्पों में से एक है। उदाहरण के लिए देखेंthis ढेर अतिप्रवाह प्रश्न।
  6. 1 2 SQL में दो समान संरचनाएं हैं जो दोनों भूमिकाओं को पूरा करती हैं, दोनों को SQL-92 में प्रस्तावित किया गया है। एक "खोज CASE" अभिव्यक्ति CASE WHEN cond1 THEN expr1 WHEN cond2 THEN expr2 [...] ELSE exprDflt END if ... else की तरह काम करता है अगर ... और, जबकि एक "सरल CASE" अभिव्यक्ति: CASE expr WHEN val1 THEN expr1 [...] ELSE exprDflt END काम करता है एक स्विच कथन के प्रकार। विवरण और उदाहरणों के लिए केस (एसक्यूएल) देखें।
  7. ^ फोरट्रान 90 में अंकगणित if अप्रचलित है।
  8. ^ रुबी 3.0 में पैटर्न मिलान जोड़ा गया था।[16] कुछ पैटर्न मिलान वाले निर्माण अभी भी प्रायोगिक हैं।


यह भी देखें

संदर्भ

  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.


बाहरी संबंध