2011-01-07 7 views
10

संभव डुप्लिकेट:क्यों {...} का उपयोग करें (FALSE); मैक्रो की सी ++ के बाहर में

do { 
    // a lot of code that only needs to be run once 
} while (FALSE); 

जब कोड एक मैक्रो को परिभाषित नहीं किया गया है:
Are do-while-false loops common?

वहाँ की तरह कोड के लिए एक कारण है ? मुझे पता है कि यह मैक्रोज़ की बात आती है, लेकिन क्या सामान्य कोड में इसका कोई कारण है?

+0

जबकि मुझे वास्तव में पता नहीं है, तो कम से कम आपको "एकल-पुनरावृत्ति लूप" से बाहर करने की अनुमति देनी चाहिए। सिद्धांत रूप में यह बड़े नेस्टेड 'if' कथन के उपयोग को कम कर सकता है। – icabod

+0

@marcog - मुख्य अंतर यह है कि सी के बारे में एक प्रश्न प्रतीत होता है विशेष रूप से, सी ++ के अपवादों की कार्यक्षमता को लागू करने के लिए उनका उपयोग करना। चूंकि यह स्पष्ट रूप से एक सी ++ प्रश्न है (जहां से कोई भी लागू नहीं होगा), मुझे लगता है कि वे अलग-अलग प्रश्न हैं। –

उत्तर

10

अच्छा, यह आपको break; (या continue) कीवर्ड का प्रारंभिक निकास के लिए उपयोग करने की अनुमति देता है यदि आपको किसी कारण से इसकी आवश्यकता है। यद्यपि वह थोड़ी बदसूरत होगी। मैं वास्तव में इसे return; कथन के माध्यम से लागू प्रारंभिक निकास के साथ अपने स्वयं के दिनचर्या में स्थानांतरित कर दूंगा।

+1

हम्म, वह बदसूरत है। मेरे लिए, यह subroutines में एक खराब नौकरी तोड़ने चीजों को इंगित करता है (जैसा कि आप अब उल्लेख करते हैं)। –

+0

मैं आपसे सहमत हूं। मुझे असीमित loops कभी पसंद नहीं आया है, वे सिर्फ मेरे लिए पतला लग रहा है :)। उस स्थिति को रखना बेहतर होगा जो लूप को थोड़ी देर में छोड़ देता है - यही वह है जो इसके लिए है। कुछ और आमतौर पर सिर्फ आलसी प्रोग्रामिंग है। मैं आलसी प्रोग्रामर के लिए एक छिपी हुई गेटो के रूप में ब्रेक/जारी रहता हूं, लेकिन यह मेरा साबुन बॉक्स है। :) – SRM

+0

क्या आप इसके बजाय रिटर्न स्टेटमेंट के माध्यम से शुरुआती निकास पसंद करते हैं? कुछ कोड जो मैं देख रहा हूं, लेखक केवल ब्रेक स्टेटमेंट को रिटर्न के साथ प्रतिस्थापित कर सकता है और डू-टाइम को हटा सकता है। क्या वो बेहतर है? – Anon

2

इस तरह के निर्माण को goto के रूप में उपयोग किया जाता है ताकि लूप के अंत के बाद break कथन का उपयोग करके कूदने में सक्षम हो सके।

+5

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

+1

बेशक प्रत्येक नियंत्रण संरचना मशीन स्तर पर एक गोटो है, लेकिन भाषा स्तर पर, 'गोटो' एक 'गोटो' कथन है और 'if' कथन नहीं है। –

0

इसका उपयोग goto कथन के समान व्यवहार को लागू करने के लिए किया जा सकता है, या कूद व्यवहार!

देखें इस:

do 
{  
    if (doSomething() != 0) break; //jump 
    if (doSomethingElse() != 0) break; //jump 
    ... 
    if (doSomethingElseNew() != 0) break; //jump 
} while(false); 

//if any of the break encountered, execution can continue from here, just after the do-while block! 

// statement1 
// statement2 
// statement3 
// so on 

यहाँ से लिया: Are do-while-false loops common?

3

खैर एक इसके लिए कारण है कि आप कुछ बिंदु पर बाहर तोड़ करना चाहते हैं होगा।

अर्थात

do 
{ 
    //some code that should always execute... 

    if (condition) 
    { 
     //do some stuff 
     break; 
    } 

    //some code that should execute if condition is not true 

    if (condition2) 
    { 
     //do some more stuff 
     break; 
    } 

    //further code that should not execute if condition or condition2 are true 

} 
while(false); 

कुछ स्थितियों में जिसके परिणामस्वरूप कोड को समझने के लिए करता है, तो जैसा कि ऊपर लिखा थोड़ा और अधिक स्पष्ट/आसान है।

+6

आप जानते हैं कि इससे हमेशा स्पष्ट क्या है और एक अनावश्यक ब्लॉक पेश नहीं करता है? 'Goto'। –

+0

@ स्टेव एम - असल में सहमत हैं। हालांकि, वहां अपने स्वयं के दिनचर्या को न्यायसंगत बनाने के लिए आईएमएचओ के बहुत सारे कोड हैं। यदि आप ऐसा करते हैं, तो आप इसके बदले 'रिटर्न' का उपयोग कर सकते हैं, जो 'गोटो' की तुलना में थोड़ा कम अनियंत्रित है, और यह dogmatic डेवलपर्स से ऐसी अवास्तविक प्रतिक्रिया नहीं खींचता है। –

2

मैं ऐसा नहीं होगा, लेकिन:

मैं थोड़ा और अधिक तार्किक लग रहा है की तुलना में सिर्फ धनुकोष्ठक

int main() 
{ 
    { 
     std::ifstream file("Data"); 
     // DO STUFF 

    } // Data now closed. 

    // LOTS OF STUFF SO YOU CANT SEE file2 below. 

    // We can re-use data here as it was closed. 
    std::ofstream file2("Data"); 
    // DO STUFF 
} 

एक अच्छा प्रेक्षक मेंटेनर ब्रेसिज़ देख सकते हैं और लगता है कि हो सकता है।
क्या बिल्ली और उन्हें

int main() 
{ 
    std::ifstream file("Data"); 
    // DO STUFF 

    // LOTS OF STUFF SO YOU CANT SEE file2 below. 

    // FAIL. data is still open from before. 
    std::ofstream file2("Data"); 
    // DO STUFF 
} 

को दूर रहते हुए मैं टिक का उपयोग कर मान लें कि कम से कम (हालांकि एक अच्छा प्रेक्षक मेंटेनर अभी भी निकाल सकते हैं) syou इसके बारे में सोचते हैं।

int main() 
{ 
    do 
    { 
     std::ifstream file("Data"); 
     // DO STUFF 

    } while (false); 

    // LOTS OF STUFF SO YOU CANT SEE file2 below. 

    // We can re-use data here as it was closed. 
    std::ofstream file2("Data"); 
    // DO STUFF 
} 
1

कभी भी एक बार लूप लिखने का कोई कारण नहीं है, जिसे संकलित समय पर, एक बार निष्पादित करने के लिए जाना जाता है।

ऐसा करने के लिए, goto का नाटक करने के लिए break के रूप में लिखा गया है, अपमानजनक है।

संपादित करें:

मैं सिर्फ महसूस किया है कि संकलन समय ज्ञान के बारे में मेरे दावे को गलत है: मैं तुम्हें एक निर्माण विन्यास के लिए, कुछ सशर्त #defines के साथ जटिल इसका मतलब यह हो सकता है कि यह कर सकते हैं संकलन समय पर लगता है, यह एक बार निष्पादित करने के लिए जाना जाता है, लेकिन एक अलग निर्माण विन्यास के लिए, इसे कई बार निष्पादित किया जाता है।

#ifdef SOMETHING 
#define CONDITION (--x) 
#else 
#define CONDITION 0 
#endif 
... 
int x = 5 
do{ 
    ... 
} while(CONDITION) 

हालांकि, मेरे दावे की भावना अभी भी खड़ी है।

+0

+1। 'करते समय (झूठा)' मैक्रोज़ के बाहर एक भयानक एंटी-मुहावरे है जो इनलाइन फ़ंक्शंस को अनुकरण करता है (जो उनके स्वयं के ब्रांड भयानक हैं)। साथ ही, अगर मैंने कभी भी वास्तविक कोड में '# परिभाषित' देखा है, तो मैं बाहर निकल जाऊंगा। –

+0

हाँ, '# परिभाषित 'एक पागल उदाहरण है, और मैं इसे आईआरएल का उपयोग करने के लिए औचित्य के साथ नहीं आ सकता। मैं बस कुछ पेडेंट नहीं चाहता था कि मुझे प्रीकंपेलर पर सबक दें। –

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