2011-11-07 11 views
5

मान लीजिए आप इस तरह छोरों के लिए दो नेस्टेड है:सी में एक superordinate पाश तोड़ने का कोई तरीका है?

int i, j; // Iterators 

for(i=0; i<100; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      /* break out of both loops */ 
     } 
    } 
} 

वहाँ एक रास्ता (सिर्फ एक पाश में break; आदेश के समान) की मौके पर ही दोनों छोरों को समाप्त करने के है?

+8

'goto' आसान है। – Mat

+0

@Mat: क्या यह एक मजाक है? – Rob

+3

@robjb मुझे शक है कि यह है। यह उन मामलों में से एक है जहां 'गोटो 'पूरी तरह ठीक है। 'गोटो 'की ओर बिना शर्त नफरत गलत है। – GSerg

उत्तर

13

आप उपयोग कर सकते हैं हो सकता है एक goto के रूप में:

int i, j; // Iterators 

for(i=0; i<100; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      goto done; 
     } 
    } 
} 
done: 

या किसी अन्य चर का उपयोग पाश पुनरावृत्तियों नियंत्रित करने के लिए:

int i, j; // Iterators 
int done = 0; 
for(i=0; i<100 && !done; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99 && !done; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      done = 1; 
     } 
    } 
} 
+0

+1 के बजाय एक अच्छा हैक है, हालांकि लोगों को 'गोटो' पसंद नहीं है, यह जोड़ने से तेज़ है प्रत्येक दौर में जांच करने के लिए। (जैसा कि आपके दूसरे विकल्पों में है) – MByD

+0

! किया गया ध्वज प्रत्येक लूप को सत्यापित किया जाता है जो कि अनुकूल नहीं है यह दूसरे विचार के लिए –

+1

+1 लगता है। मैं यही करूंगा। 'गोटो 'तेज है, लेकिन यह भी खतरनाक है। अजीब चीजें तब हो सकती हैं जब आप इसे लिखते समय बहुत ध्यान नहीं देते हैं। ध्वज का सत्यापन केवल बाहरी पाश में किया जा सकता है, 'किया गया = 1' के बाद सही 'ब्रेक' जोड़ें, और यह कम्प्यूटेशनल लागत को कम करेगा (हालांकि यह आज के कंप्यूटरों के लिए बहुत छोटा है) – Victor

5

हमारा अच्छा दोस्त goto आप के लिए है कि संभाल कर सकते हैं!

int i, j; // Iterators 

for(i=0; i<100; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      /* break out of both loops */ 
      goto ExitLoopEarly; 
     } 
    } 
} 
goto ExitLoopNormal; 

ExitLoopEarly: 
.... 

ExitLoopNormal: 
... 
4

कि एक समाधान

function void loop() 
{ 
       int i, j; // Iterators 

      for(i=0; i<100; ++i) { 
       /* do some stuff */ 
       ... 
       for(j=0; j<99; ++j) { 
        /* do more stuff */ 
        ... 
        if(someFunction(j,i) == 2) { 
         return; 
        } 
       } 
      } 
} 
+0

यह केवल कुछ मामलों को पूरा करेगा, आप लूप के अंदर उपयोग किए जाने वाले किसी भी मूल्य को अनदेखा कर सकते हैं। – MByD

+0

आपका क्या मतलब है? मैं वास्तव में आप समझ सकते हैं नहीं –

+0

की सुविधा देता है का कहना है कि वह एक समारोह में तीन तरह के डबल छोरों है, और उन छोरों में वह समारोह के कुछ स्थानीय चर को संशोधित करता है, वह प्रत्येक चर कि में प्रयोग किया जाता है (संदर्भ) के द्वारा पारित करने के लिए की आवश्यकता होगी समारोह के लिए लूप। गोटो या कुछ ध्वज अधिक उचित लगते हैं। – MByD

0

आप दो लो डाल सकते हैं एक समारोह में ops और return

void foo(){ 
int i, j; // Iterators 

for(i=0; i<100; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      return; 
     } 
    } 
} 
} 
संबंधित मुद्दे