2010-07-14 15 views
33

मैं फॉर-लूप के भीतर 'ब्रेक' कथन का उपयोग कैसे कर सकता हूं जो एक निर्दिष्ट लेबल बना रहता है?उद्देश्य सी फॉर-लूप ब्रेक और

पूर्व;

outer: for(int i = 0;i<[arABFBmatches count];i++){ 
    for(int i = 0;i<[arABFBmatches count];i++){ 
     // 
     break _____; 
    } 
} 

बाहरी को कैसे तोड़ें?

उत्तर

94

अपने प्रश्न से कहना मुश्किल है। मैं इसे समझूंगा कि आप आंतरिक लूप के बाकी पुनरावृत्तियों को छोड़ना चाहते हैं और बाहरी लूप जारी रखना चाहते हैं?

for (int i = 0; i < [arABFBmatches count]; i++) { 
    for (int j = 0; j < [arABFBmatches count]; j++) { 
     if (should_skip_rest) 
      break; // let outer loop continue iterating 
    } 
} 

ध्यान दें कि मैंने आपके आंतरिक लूप इनवेरिएंट का नाम बदल दिया है; दोनों में i का उपयोग पागलपन को आमंत्रित कर रहा है।

यदि आप दोनों loops से तोड़ना चाहते हैं, तो मैं एक गोटो का उपयोग नहीं करता। मैं करूँगा:

BOOL allDoneNow = NO; 
for (int i = 0; i < [arABFBmatches count]; i++) { 
    for (int j = 0; j < [arABFBmatches count]; j++) { 
     if (should_skip_rest) { 
      allDoneNow = YES; 
      break; 
     } 
    } 
    if (allDoneNow) break; 
} 
+32

+1। – uchuugaka

+9

और कृपया, पठनीयता के लिए, आइए हम अपने ऑपरेटरों के आस-पास की जगहों को न भूलें। नहीं "के लिए (int i = 0; i <[arabFBmatches count]; i ++)"।इसके बजाए: "के लिए (int i = 0; i <[arabFBmatches count]; i ++)" –

+0

आप सर जीनियस हैं। – GeneCode

9

मोटे तौर पर:

for(int i = 0;i<[arABFBmatches count];i++){ 
    for(int j = 0;j<[arABFBmatches count];j++){ 
     // 
     goto outer_done; 
    } 
} 
outer_done: 

ऑब्जेक्टिव-सी तोड़ करार दिया है नहीं करता है।

+1

यदि आप 'गोटो 'का उपयोग करने जा रहे हैं, तो बहुत सावधान रहें कि आप मेमोरी प्रबंधन को सही तरीके से संभाल लें। –

+0

'गोटो 'ध्वज सेट करने और ध्वज का परीक्षण करने से बेहतर है ताकि बाहरी लूप को तोड़ना है या नहीं। सुनिश्चित करें कि हमें सावधान रहना चाहिए। – neevek

+4

बिल्कुल जरूरी नहीं है; यदि आंतरिक लूप कुछ सेटअप/टियरडाउन तर्क से घिरा हुआ है, तो 'गोटो' खुशी से टियरडाउन पर कूद सकता है। यदि आपको बाद में इस तरह के तर्क को जोड़ना है, तो रिफैक्टरिंग करते समय शॉर्ट सर्किट केस को भूलना आसान है। नियंत्रण-प्रवाह के लिए एक मजबूत तर्क है जो जम्प्लेस है। – bbum

1

'ब्रेक' केवल आपको सबसे लूप या स्विच से बाहर ले जाएगा। आप किसी भी समय किसी फ़ंक्शन से बाहर निकलने के लिए 'वापसी' का उपयोग कर सकते हैं। कृपया this लिंक पर एक नज़र डालें।

+0

अधिकांश वाणिज्यिक डिजाइन नियम किसी फ़ंक्शन से केवल एक (1) 'वापसी' मांगते हैं। – Vincent

1
BOOL done = NO; 
for(int i = 0;i<[arABFBmatches count] && !done; i++) 
{ 
    for(int i = 0;i<[arABFBmatches count] && !done;i++) 
    { 
     if (termination condition) 
     { 
      // cleanup 
      done = YES; 
     } 
    } 
} 
+1

क्या आप एक स्पष्टीकरण भी जोड़ सकते हैं? – Robert

2

एप्पल के ऑब्जेक्टिव-सी डॉक्स से:

ऑब्जेक्टिव-सी मानक एएनएसआई सी भाषा के लिए एक्सटेंशन की एक छोटी लेकिन शक्तिशाली सेट के रूप में परिभाषित किया गया है।

तो तोड़ने के लिए और वे जहाँ भी सी में अनुमति दी जाती है इस्तेमाल किया जा सकता जारी रखने के

जारी रखने के निर्माणों पाशन में इस्तेमाल किया जा सकता है (के लिए है, जबकि और कर/while लूप)।

ब्रेक उसी लूपिंग संरचनाओं के साथ-साथ स्विच स्टेटमेंट में भी उपयोग किया जा सकता है।

2

वोट नीचे ...... यदि गोटो का उपयोग कोड को सरल बनाता है, तो यह उचित होगा।

for (;;) 
{ 
    for (;;) 
    { 

     break; /* breaks inner loop */ 

    } 

    for (;;) 
    { 

     goto outer; /* breaks outer loop */ 
    } 

} 
outer:; 
+1

यह उत्तर [इस पोस्ट] से चोरी किया गया प्रतीत होता है (http://stackoverflow.com/questions/863172/how-can-i-break-out-of-two-nested-for-loops-in-objective-c/863,392 # 863,392)। – Pang

+0

नहीं, क्षमा करें यह उत्तर मेरा है। –

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