क्या "और अगर" एक एकल कीवर्ड है?


100

मैं C ++ में नया हूं। मैं अक्सर नीचे की तरह सशर्त विवरण देखता हूं:

if 
  statement_0;
else if
  statement_1;

सवाल:

वास्तव में , क्या मैं else ifएक एकल कीवर्ड के रूप में व्यवहार करूंगा ? या यह वास्तव में नीचे की तरह ifबाहरी के भीतर एक नेस्टेड बयान है else?

if 
  statement_0;
else 
  if
    statement_1;

5
अपने दूसरे बिंदु पर। else if
सिंथेटिक रूप से

8
नहीं, जैसा कि व्याकरण अभी भी अधिक जटिल होगा: एक शब्द अंतरिक्ष के बिना एक शब्द है। अन्य भाषाओं में हालांकि कीवर्ड elseifऔर जैसे हैं ELIF। वास्तव में केवल (?) प्रोग्रामिंग भाषा Algol68 एक पहचानकर्ता में एक स्थान की अनुमति देता है; बहुत अच्छा:PROC walk through tree ()
जोप एगेन

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

1
elseifकीवर्ड वीबी और PHP में मौजूद है।
सलमान ए

3
Nitpick: हालाँकि C ++ में आधिकारिक रूप से रिक्त स्थान वाले कीवर्ड नहीं हैं, लेकिन इसमें निर्माण के सभी उद्देश्य और उद्देश्य जैसे हैं। उदाहरण के लिए, long doubleआपको उस तरीके से लिखना होगा। longdoubleगलत है।
श्री लिस्टर

जवाबों:


133

वे एक भी कीवर्ड नहीं हैं यदि हम ड्राफ्ट C ++ मानक अनुभाग में जाते हैं तो 2.12 कीवर्ड टेबल 4दोनों ifको elseअलग-अलग सूचीबद्ध करती है और कोई else ifकीवर्ड नहीं है । हम कीवर्ड पर cppreferences अनुभाग पर जाकर C ++ कीवर्ड की अधिक सुलभ सूची पा सकते हैं ।

अनुभाग में व्याकरण 6.4भी यह स्पष्ट करता है:

selection-statement:
 if ( condition ) statement
 if ( condition ) statement else statement

ifमें else ifएक है बयान निम्नलिखित elseअवधि। अनुभाग यह भी कहता है:

[...] एक चयन-बयान में प्रतिस्थापन (प्रत्येक प्रतिस्थापन, यदि कथन के अन्य रूप में ) स्पष्ट रूप से ब्लॉक स्कोप (3.3) को परिभाषित करता है। यदि चयन-वक्तव्य में सबस्टेशन एक एकल स्टेटमेंट है और एक कंपाउंड-स्टेटमेंट नहीं है , तो यह ऐसा है जैसे कि यह कंपाउंड-स्टेटमेंट हो जिसमें मूल सबस्टेशन हो।

और निम्नलिखित उदाहरण प्रदान करता है:

if (x)
 int i;

can be equivalently rewritten as

if (x) {  
  int i;
}

तो आपके थोड़े विस्तारित उदाहरण को कैसे पार्स किया जाता है?

if 
  statement_0;
else 
  if
    statement_1;
  else
    if
      statement_2 ;

इस तरह पार्स किया जाएगा:

if 
{
  statement_0;
}
else
{ 
    if
    {
      statement_1;
    }
    else
    {
        if
        {
         statement_2 ;
        }
    }
}

ध्यान दें

हम यह भी तय कर सकते हैं कि else ifएहसास है कि द्वारा एक कीवर्ड नहीं किया जा सकता कीवर्ड हैं पहचानकर्ता और हम करने के लिए अपने जवाब में एक पहचानकर्ता के लिए व्याकरण से देख सकते हैं कर सकते हैं एक संख्यात्मक अंक के साथ एक वर्ग के नाम से शुरू? पहचानकर्ताओं में उस स्थान की अनुमति नहीं है और इसलिए else ifएक भी कीवर्ड नहीं हो सकता है लेकिन दो अलग-अलग कीवर्ड होने चाहिए ।


1
आप मानक के बिना यह कटौती कर सकते हैं? एएसएम में इसकी: jeq( if| else if), jne( if| else if), jmp( else)। उसके आधार पर, मैंने कहा था कि यह एक एकल खोजशब्द था .. शायद वाक्य-निर्माण का नहीं बल्कि निर्देश-वार।
ब्रैंडन

18
@ मुझे बहुत संदेह है कि आप मज़बूती से असेंबली लैंग्वेज से लेकर उच्च स्तर के निर्माणों तक जा सकते हैं, जिसका उपयोग व्याकरण के अंतरंग ज्ञान और कम्पाइलर के बिना ही किया जा सकता है।
शफीक यघमौर

हालांकि ध्यान दें कि यह परिभाषा संभावित रूप से अद्भुत "झूलने वाले और" अस्पष्ट सिंटैक्स ट्री समस्या की ओर ले जाती है जब पार्सर में व्याकरण को परिभाषित करता है ...
LinearZoetrope

2
कुछ भाषाएं समर्थन नहीं करती हैं else if, लेकिन इसके बजाय elsif। उन भाषाओं में, else ifवास्तव में एक कीवर्ड है। हालाँकि, सी-आधारित भाषा आम तौर पर नहीं होती है, क्योंकि यह उत्तर बताता है।
sfdcfox

1
मुझे लगता है कि @Krumia एक अंतिम elseवक्तव्य देखना चाहता था । मैं इसकी सराहना करूंगा।
माथियास

78

सिंथेटिक, यह एक भी खोजशब्द नहीं है; कीवर्ड में सफेद स्थान नहीं हो सकता। तार्किक रूप से, जब सूची लिखते हैं else if, तो संभवतः यह बेहतर होता है यदि आप इसे एकल कीवर्ड के रूप में देखते हैं, और लिखते हैं:

if ( c1 ) {
    //  ...
} else if ( c2 ) {
    //  ...
} else if ( c3 ) {
    //  ...
} else if ( c4 ) {
    //  ...
} // ...

संकलक शाब्दिक रूप से इसे देखता है:

if ( c1 ) {
    //  ...
} else {
    if ( c2 ) {
        //  ...
    } else {
        if ( c3 ) {
            //  ...
        } else {
            if ( c4 ) {
                //  ...
            } // ...
        }
    }
}

लेकिन दोनों रूप एक ही चीज से सामने आते हैं, और पहला और अधिक पठनीय है।


1
वास्तव में, संकलक ने शाब्दिक रूप से elseअनुगमन नहीं देखा compound-statement। एक के बाद else, यह देखने के लिए statement(जैसे हो सकता है return;या f()) या एक compound-statement...
मास्क

@ TheMask: प्रति शैफिक याघमौर के उत्तर के अनुसार, कंपाइलर वास्तव में एक ही स्टेटमेंट देखता है, लेकिन यह दिखावा करता है कि उसने एक कंपाउंड-स्टेटमेंट देखा है।
इल्मरी करोनें

यह उत्तर बताता है कि पार्सर टोकन कैसे निकालता है। अच्छा।
haccks

24

नहीं ऐसा नहीं है।
वे दो कीवर्ड हैं और इसके अलावा, दूसरा "इफ" एक "सबस्टेशन" है, जो पहले "और" स्टेटमेंट द्वारा निर्धारित स्कोप है।


2
यद्यपि यह अच्छी तरह से वर्णन करता है कि क्या चल रहा है, आप वास्तविक भाषा परिभाषाओं के लिए कुछ संदर्भ जोड़ना चाह सकते हैं ताकि आप जो कह रहे हैं उसे बेहतर साबित कर सकें।
atν 19α ῥεῖ

2
@ theν referencesαῥεῖ: आप संदर्भों के बारे में सही हैं, लेकिन यह काम अभी तक शाफ़िक याघमौर ने किया है। उनका जवाब स्वीकार किया गया था और मैंने मतदान किया है, भी। मेरा काम यहीं खत्म हो गया।
पाब्लो १

16

आप घुंघराले ब्रेसिज़ का उपयोग करके गुंजाइश देख सकते हैं:

if(X) {
  statement_0;
}
else {
  if(Y) {
    statement_1;
  }  
}

और आम तौर पर दो अलग-अलग कीवर्ड के साथ कार्यान्वित किया जाता है, एक है यदि और एक अन्य है


तो मुझे लगता है कि जो लोग कहते हैं कि घुंघराले ब्रेसिज़ का उपयोग किया जाना चाहिए जहाँ भी एक यौगिक कथन को स्वीकार किया जाता है, इस तरह से अपने सभी nontrivial सशर्त लिखना चाहिए, हुह? :)
डैल

5
मुझे लगता है कि कोई भी कुछ भी कर सकता है, यहां तक ​​कि हमारे सभी प्यारे घुंघराले ब्रेसेस भी। घर पर यह मत करो।
बारहसिंगा

1
सभी ब्रेस-संरचित भाषाएं (जो मुझे पता है) जिनके लिए सभी सबस्टेशनों के आसपास घुंघराले ब्रेसिज़ की आवश्यकता होती है , भले ही एक कथन से बना हो, एक एकल-टोकन कीवर्ड का अर्थ "और यदि" है। मुझे लगता है कि वह बता रहा है।
zwol

@ ज़ैक: स्विफ्ट एक ऐसी भाषा है जो आपके नियम को तोड़ती है। इसे सिंगल-स्टेटमेंट कोड ब्लॉक के लिए भी कर्ली ब्रेसिज़ की आवश्यकता होती है, लेकिन इसमें "अगर" कीवर्ड नहीं है। दूसरी ओर, व्याकरण C. एक if-statementवैकल्पिक के साथ समाप्त होता है else-clause। एक else-clauseहै या तो else code-block या else if-statementcode-blockअनिवार्य ब्रेसिज़ शामिल हैं। इसलिए elseकीवर्ड का पालन केवल {या उसके द्वारा किया जा सकता है if
ग्रेनाइटटॉर्ट

@GraniteRobert अपने आप को स्विफ्ट में देखने के लिए बिल्कुल समय नहीं था, लेकिन यह एक दिलचस्प डेटा बिंदु है; मैं सोच रहा था कि एक व्याकरण की तरह यह एक संभावना थी, लेकिन ऐसा कभी नहीं देखा था। और आप ध्यान देंगे कि लोग भी लिखने से बचते हैं else { if ... }
zwol

10

जैसा कि पहले ही उत्तर दिया गया है, यह नहीं है। वे दो कीवर्ड हैं। यह एक दूसरे के बाद दो बयानों की शुरुआत है। इसे थोड़ा और स्पष्ट करने का प्रयास करने के लिए, यहाँ BNF ग्रामर है जो C ++ भाषा में ifऔर elseकथनों से संबंधित है।

 statement:      
    labeled-statement
    attribute-specifier-seqopt expression-statement
    attribute-specifier-seqopt compound-statement    
    attribute-specifier-seqopt selection-statement  
    attribute-specifier-seqopt iteration-statement    
    attribute-specifier-seqopt jump-statement  
    declaration-statement
    attribute-specifier-seqopt try-block

   selection-statement: 
         if ( condition ) statement
     if ( condition ) statement else statement

ध्यान दें कि statementस्वयं शामिल हैं selection-statement। तो, जैसे संयोजन:

if (cond1)
   stat
else if(cond2)
   stat
else
   stat

C ++ मानक / शब्दार्थ के अनुसार संभव और मान्य हैं।

नोट: C ++ व्याकरण इस पृष्ठ से लें।


1

अन्य और अगर दो अलग सी ++ हैं कीवर्डयदि एक कथन को वैकल्पिक रूप से अनुसरण किया जा सकता है यदि ... और कथन। एक अगर बयान शून्य या अधिक हो सकता है किसी और अगर है और वे पहले आना चाहिए और कुछ

आप सिंटैक्स और उदाहरण इसमें पा सकते हैं यदि ... और स्टेटमेंट ट्यूटोरियल


-1

मैं इन सभी स्पष्टीकरणों के साथ अपनी बात जोड़ना चाहूंगा। जैसा कि मैं इसे देखता हूं, यदि आप इन कीवर्ड का अलग-अलग उपयोग कर सकते हैं, तो उन्हें TWO कीवर्ड होना चाहिए। हो सकता है कि आप स्टैकओवरफ़्लो में इस लिंक से c ++ व्याकरण पर एक नज़र डाल सकते हैं: क्या कोई मानक C ++ व्याकरण है?

सादर


-1

यदि कोई कथन वैकल्पिक रूप से अनुसरण किया जा सकता है यदि ... और कथन, जो कि एकल का उपयोग करके विभिन्न स्थितियों का परीक्षण करने के लिए बहुत उपयोगी है ... और यदि कथन।

उपयोग करते समय, यदि और, तो बयान, कुछ बिंदुओं को ध्यान में रखना है।

यदि शून्य हो सकता है या किसी और का हो सकता है और इसे किसी अन्य के बाद आना चाहिए।

यदि किसी के पास शून्य हो सकता है तो कई और दूसरे से पहले आना चाहिए।

एक बार अगर कोई सफल हो जाता है, तो बाकी में से कोई भी अगर बाकी है या नहीं, तो उसका परीक्षण किया जाएगा।

एक नज़र है अगर ... और बयान ट्यूटोरियल


2
यह सिर्फ मानक के अनुरूप नहीं है, और इसके अलावा, निरर्थक है। भाषा के पास अनुकरण करने की सभी अभिव्यंजक शक्ति है else ifजैसे कि यह एक कीवर्ड था, इसलिए इसे स्पष्ट रूप से परिभाषित करने में कोई अर्थ नहीं होगा।
रुस्लान

1
यह प्रोग्रामर के लिए एक उपयोगी सरलीकरण है। लेकिन सवाल यह नहीं है कि बयानों का उपयोग कैसे किया जाए।
क्रंचर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.