2015-07-29 10 views
7

मैं इस समय इसअगर() क्या {} जबकि() बयान

if(x.start()) do if(y.foo(x)) { 

// Do things 

}while(x.inc()) 

यहाँ x की तरह एक बयान के साथ, किसी की किसी और कोड पर काम कर रहा हूँ कस्टम वर्ग कि y के बारे में जानकारी रखता है और अपने तत्व के माध्यम से यात्रा की अनुमति देता है एक विशेष आदेश में। मैं अगर प्रासंगिक यह जानकारी डाल दिया, लेकिन मेरे सवाल का अधिक सामान्य है:

मैंने सोचा था कि एक do{}while() बयान में do हिस्सा है, ब्रैकेट द्वारा पीछा किया जा सकता था और इस togheter साथ अंत में while() हालत do- को परिभाषित करता है घुमाव के दौरान।

  • क्यों हम सही do के बाद एक if रख सकते हैं?
  • यह क्या करता है?
  • do और { के बीच और क्या रखा जा सकता है?

मैं इस के लिए या गूगल पर, सबसे while loop अंदर if बयान डालने से संबंधित सामान संबंधित अन्य प्रश्न नहीं पा सके।

+3

"मैंने सोचा कि एक काम में {} जबकि() कथन में भाग भाग को ब्रैकेट द्वारा पालन करना था" गलत है। – usr2564301

उत्तर

8

व्याकरण किसी भी बयानdo और while के बीच अनुमति देता है। यह आमतौर पर आप कथन का एक विशेष रूप देखते हैं - यौगिक-कथन, { /* statements */ }, जिसे आमतौर पर ब्लॉक भी कहा जाता है।

कोड का do-, जबकि भाग बिल्कुल

do { 
    if(y.foo(x)) { 
     // Do things 
    } 
} while(x.inc()); 
5

do-, जबकि बयान के बराबर निम्नलिखित तरीके

do statement while (expression) ; 

ऐसा करने के बीच और जब तक वहाँ किसी भी हो सकता है परिभाषित किया जाता है अगर कथन सहित बयान।

अपने प्रश्न

• और क्या कर और {के बीच में रखा जा सकता का सवाल है?

व्याकरण के अनुसार व्याकरण के अनुसार एक बयान होना चाहिए। तो एकमात्र संभावना जो अजीब लग सकती है लेकिन वैध है वह लेबल रखना है। उदाहरण के लिए

do L1: { std::cout << "Hello do-while!" << std::endl; } while (false); 

क्योंकि लेबल किए गए बयान का भी उपयोग किया जा सकता है।

उदाहरण के लिए अपने पद से do-, जबकि बयान देखने के

if(x.start()) do Come_Here: if(y.foo(x)) { 

// Do things 

}while(x.inc()) 

की तरह खाते है कि आप भी एक खाली बयान का उपयोग कर सकते में ले सकता है।इस मामले में यह

do ; while (false); 

या

do Dummy:; while (false); 

और एक और हास्यास्पद बयान C++ घोषणाओं भी बयान कर रहे हैं

do One: do Two: do Three:; while (0); while (0); while (0); 

भी तरह दिखेगा। तो आप और कब के बीच एक घोषणा कर सकते हैं।

उदाहरण

int n = 10; 
do int i = (std::cout << --n, n); while (n); 

सी घोषणाओं में लिए बयान नहीं हैं। तो अगर आप करते हैं के बीच और जब तक सी

में

और एक और हास्यास्पद उदाहरण एक घोषणा नहीं डाल सकते हैं

#include<iostream> 
#include <vector> 
#include <stdexcept> 

int main() 
{ 
    std::vector<int> v = { 1, 2, 3 }; 
    size_t i = 0; 

    do try { std::cout << v.at(i) << ' '; } catch (const std::out_of_range &) 
    { std::cout << std::endl; break; } while (++i); 

    return 0; 
} 

कार्यक्रम उत्पादन

1 2 3 
0

कर बयान है, जबकि के व्याकरण है:

कथन करते समय (अभिव्यक्ति);

अनिवार्य रूप से आप कीवर्ड के बाद और थोड़ी देर के कीवर्ड के बाद कोई भी कथन डाल सकते हैं। सामान्य उपयोग में हम एकाधिक कथन (यौगिक कथन) के समूह को अनुमति देने के लिए एक घुंघराले ब्रैकेट के साथ करते हैं, लेकिन यदि आप कीवर्ड के बाद केवल एक कथन रखना चाहते हैं, तो घुंघराले ब्रेस वैकल्पिक है। हालांकि मैं पठनीयता की सहायता के लिए घुंघराले ब्रैकेट का उपयोग करने की दृढ़ता से अनुशंसा करता हूं।

आपके मामले में, यदि ब्लॉक एक पूर्ण विवरण है और यह बिल्कुल ठीक है।

यहां एक कथन का एक और उदाहरण है जिसमें एक कथन शामिल है।

int i = 0; 

do std::cout<<i<<std::endl; 
while (i++ < 5); 
+0

सी ++ व्याकरण बैकस-नौर फॉर्म द्वारा वर्णित नहीं है। बस इसे व्याकरण कहते हैं। –

+0

सहमत एन संपादित। – Paani

0

मुझे लगता है कि इस तरह का इंडेंट कुछ भ्रम पैदा करता है।

मैं व्यक्तिगत रूप से इस बारे में होगा:

if(x.start()) 
    do 
     if(y.foo(x)) { 
      // Do things 
     } 
    while(x.inc()) 

बयान के बाद कर कोष्ठक की जरूरत नहीं है, तो यह केवल एक "पंक्ति" है। वैसे ही, जब आप अधिक निर्देश प्राप्त करते हैं तो आप केवल ब्रैकेट का उपयोग करते हैं। इस मामले में ब्रैकेट्स के लिए हैं और क्योंकि डू-टाइम में केवल एक ही निर्देश है, वह ब्रैकेट का उपयोग नहीं करता है।

यह मुझे लगता है कि अगर कोई पुष्टि कर सकता है तो बेहतर होगा।

+1

ब्रेसिज़ छोड़ने की आपकी आदत आपको एक दिन गंभीर परेशानी में लाने जा रही है। –

2
सी ++ 14 मानक के अनुसार

,

§6।5 पुनरावृत्ति बयान:

do statement while (expression); 

कहाँ statement हो सकता है:

§6 कथन:

labeled-statement 
expression-statement 
compound-statement (also, and equivalently, called “block”): 
    { statement-seq } 
    statement-seq: 
     statement 
     statement-seq statement 
... 

तो आप किसी भी वैध बयान do और while के बीच में डाल सकते हैं।

ध्यान दें कि, में बयान substatement निष्पादित किया जाता है बार-बार जब तक expression का मूल्य false हो जाता है। परीक्षण statement के प्रत्येक निष्पादन के बाद होता है।

संबंधित मुद्दे