2012-09-07 8 views
6

यह मैं करना चाहते हैं क्या है। मुझे कोड के एक साधारण ब्लॉक के लिए कुछ पसंद है। क्या यह संभव है?
क्या मुझे "गोटो" का उपयोग करने के लिए मजबूर किया गया है?सी ++ कोड ब्लॉक से कैसे बाहर निकलें?</p> <pre><code>{ ... if(condition) break; ... } </code></pre> <p>यह एक पाश के लिए काम करता है:


मुझे लगता है कि break बयान के इस तरह के एक विस्तार के लिए सी ++ 11 एक उपयोगी इसके अलावा हो गया होता ...

+4

... या अधिक परमाणु कार्यों के साथ अपने कोड को दोबारा करने के लिए। –

+0

क्या आप एक उदाहरण प्रदान कर सकते हैं? –

+1

यदि आप अधिक कोड पोस्ट करेंगे, तो हम गोटो या अन्य चालों का उपयोग करने से बेहतर समाधान सुझा सकते हैं। – Steed

उत्तर

5

कैसे के बारे में

do 
{ 
    ... 
    if(condition) 
     break; 
    ... 
} 
while (0); 

मैं विशेष रूप से इस तरह नहीं है शैली लेकिन मैंने इसे पहले देखा है। यदि रिफैक्टरिंग प्रश्न से बाहर है (एक बड़े ब्लॉक के लिए हो सकता है जो बदले में बहुत सी चीजें तोड़ सकता है), यह एक विकल्प है।

+5

यह 'गोटो' से बेहतर कैसे है? – MSalters

+5

@MSalters एक के लिए, यह 'goto' का उपयोग नहीं करता है ... –

+4

@LuchianGrigore मुझे नहीं पता, यह काम करता है लेकिन इस मामले में चाल एक गोटो से अधिक भ्रमित है।कम से कम आप जानते हैं कि क्या होता है और क्यों, कब/समय (मुझे लगता है कि उसका कोड यहां छोटा नहीं है) जब कोई कोड पढ़ता है तो पहले लूप के बारे में सोचता है तो उसे थोड़ी देर (0) के कारण को समझना चाहिए .. –

4

यह एक:

{ 
    // ... 

    if (!condition) 
    { 
     // ... 
    } 
} 

इस कोड का एक खंड से बाहर कूद करने के goto से बचने जाएगा।

+1

मैं आपसे सहमत हूं, लेकिन मेरे मामले में अधिकांश कोड को ब्लॉक के आगे आगे बढ़ना होगा। स्टाइलिस्टिक रूप से स्थिति बेहतर होने पर ब्लॉक से बाहर निकलने में सक्षम होना बेहतर होगा। – Pietro

+0

या यह करने का एक आसान तरीका है और स्टाइलिश होने के बजाय आपके कोड की अधिक समझदार समझदारी है। स्टाइलिश रेफर लूचियन ग्रिगोर के कोड होने के लिए इसमें कोई गेटो स्टेटमेंट नहीं है। :) –

3

यहाँ सिर्फ कुछ अतिरिक्त संभावनाएं:

for(..) 
{ 
    continue;//next loop iteration 
} 

void mymethod() 
{ 
    ... 
    return; 
    ... 
} 

शायद आप कोड की समस्या पैदा करने वाले ब्लॉक के लिए उप-तरीकों बनाने चाहिए गोटो का उपयोग करें और वापसी के उपयोग द्वारा कोड के ब्लॉक को छोड़ना चाहते थे।

switch(0) { 
default: 
    /* code */ 
    if (cond) break; 
    /* code */ 
} 

(कभी नहीं ऐसा करने के लिए कृपया)

+0

ये मामले प्रश्न का उत्तर नहीं दे रहे हैं क्योंकि वे कोड –

+0

कोड के साधारण ब्लॉक नहीं हैं कभी-कभी सवाल स्वयं समस्या का हिस्सा होता है। कोड-ब्लॉक छोड़ने के बजाय उप-दिनचर्या का उपयोग करने के लिए कोड को फिर से फैक्टर करना संभवतः सबसे साफ समाधान होगा। इसलिए एक विशिष्ट कोड-ब्लॉक छोड़ने के लिए और आवश्यकता नहीं होगी। – Alex

4

यहाँ एक तरीका है return

[&](){ 
    ... 
    if(condition) 
     return; 
    ... 
}(); 

ध्यान दें कि [&] संदर्भ द्वारा सभी चर को कैप्चर करता है, यदि आप इसका उपयोग नहीं करते हैं तो इसे []

+0

अच्छा विचार, क्यों नहीं, क्या संभव हो सकता है गलत ... इस तक, मेरा सबसे अच्छा जवाब 'int (int i = 0;! I ++;) {...}' है लेकिन स्विच-केस में चर शामिल नहीं है और बेहतर लगता है। – MetNP

3

में सी ++ 11 प्राप्त करने के लिए यह एक गुमनाम लैम्ब्डा समारोह और साथ break की जगह का उपयोग है सबसे अच्छा तरीका है:

+1

अच्छा। हालांकि कि 'वापसी' भ्रामक है, क्योंकि कोड का उद्देश्य प्रभावी रूप से 'ब्रेक' है। – Pietro

+0

@Pietro आप सही! इसके अलावा, इस विधि की मुख्य सीमा यह है कि यह एक ब्लॉक के समान तरीके से 'वापसी' नहीं कर सकता है। यदि आपको अपने ब्लॉक को वापस करने की आवश्यकता है तो 'सही समय' समाधान सही है। –

0

"मुझे कोड के एक साधारण ब्लॉक के लिए कुछ पसंद है।"

किसी शर्त के मिलने के बाद return का उपयोग करें, और return कॉलर पर वापस नियंत्रण करें।

void MyWorkerClass::doWork(Item & workItem) { 
    // ... 
    if(noMoreWorkToDo) 
     return; 
    // ... 
} 
संबंधित मुद्दे