2012-03-14 15 views
55

यदि मैं break कथन का उपयोग करता हूं, तो यह केवल आंतरिक लूप को तोड़ देगा और मुझे बाहरी लूप को तोड़ने के लिए कुछ ध्वज का उपयोग करने की आवश्यकता है। लेकिन अगर कई नेस्टेड लूप हैं, तो कोड अच्छा नहीं लगेगा।नेस्टेड लूप से कैसे बाहर निकलना है?

क्या सभी लूप तोड़ने का कोई और तरीका है? (कृपया goto stmt उपयोग नहीं करते।)

for(int i = 0; i < 1000; i++) { 
    for(int j = 0; j < 1000; j++) { 
     if(condition) { 
      // both of the loops need to break and control will go to stmt2 
     } 
    } 

} 

stmt2 
+1

आप पाश शुरू होने से पहले मैं और इंट जे पूर्णांक कोशिश कर सकते हैं और फिर शर्त पर उन्हें 1001 पाश अगले पुनरावृति नहीं होगा। –

+0

सी ++ संस्करण: http://stackoverflow.com/questions/1257744/can-i-use-break-to-exit-multiple-nested-for-loops –

उत्तर

33

के बारे में क्या:

if(condition) { 
i = j = 1000;break; 
} 
+0

ऐसा लगता है व्यावहारिक समाधान – user966379

+21

काम करता है, लेकिन बदसूरत और सामान्य नहीं। क्या होगा यदि कोई व्यक्ति 2000 तक सीमा बदलता है (मान लीजिए कि कोड लंबा है, तो आप तुरंत इसे नोटिस नहीं करते हैं)? – ugoren

+0

@ugoren यह तब भी इतना आसान है। क्या होगा यदि आपने वैश्विक प्रारंभ में 'कॉन्स इंट गिनती = 1000' का उपयोग किया था। या एक '# परिभाषित' मैक्रो के रूप में। – Laksith

11

आप एक बूलियन चर की आवश्यकता होगी, अगर आप चाहते हैं यह पठनीय:

bool broke = false; 
for(int i = 0; i < 1000; i++) { 
    for(int j = 0; j < 1000; i++) { 
    if (condition) { 
     broke = true; 
     break; 
    } 
    } 
    if (broke) 
    break; 
} 

आप इसे कम पठनीय आप बूलियन मूल्यांकन शामिल हो सकते हैं चाहते हैं:

bool broke = false; 
for(int i = 0; i < 1000 && !broke; i++) { 
    for(int j = 0; j < 1000; i++) { 
    if (condition) { 
     broke = true; 
     break; 
    } 
    } 
} 

एक अंतिम जिस तरह से आप प्रारंभिक पाश को अमान्य कर सकते हैं:

for(int i = 0; i < size; i++) { 
    for(int j = 0; j < 1000; i++) { 
    if (condition) { 
     i = size; 
     break; 
    } 
    } 
} 
0
int i = 0, j= 0; 

for(i;i< 1000; i++){  
    for(j; j< 1000; j++){ 
     if(condition){ 
      i = j = 1001; 
      break; 
     } 
    } 
} 

दोनों छोरों टूट जाएगा।

112

नहीं, break के साथ मज़े को खराब न करें। यह goto का अंतिम शेष वैध उपयोग है :)

यदि ऐसा नहीं है तो आप गहरे घोंसले वाले लूप से बाहर निकलने के लिए झंडे का उपयोग कर सकते हैं।

नेस्टेड लूप से बाहर निकलने का एक और तरीका दोनों लूप को एक अलग फ़ंक्शन में कारक करना है, और उस फ़ंक्शन से वापस निकलना है जब आप बाहर निकलना चाहते हैं।

संक्षिप्त - नेस्टेड छोरों से बाहर तोड़:

  1. उपयोग goto
  2. उपयोग झंडे
  3. कारक बाहर अलग समारोह में छोरों कॉल

यहाँ xkcd सहित नहीं विरोध नहीं किया जा सका :)

enter image description here

source

Goto's are considered harmful लेकिन जैसा कि टिप्पणी में कई लोगों का सुझाव है यह होने की जरूरत नहीं। अगर बुद्धिमानी से इस्तेमाल किया जाता है तो यह एक अच्छा उपकरण हो सकता है। संयम में इस्तेमाल किया कुछ भी मजेदार है।

+17

गोटो उतना स्पष्ट है जितना आप यहां पाएंगे, हाँ। बाहर निकलने वाले चर को 1000 तक सेट करना और भी अधिक है। – correnos

+3

मैं यह जोड़ना चाहता हूं कि गेटोस स्पष्ट रूप से बुरा नहीं हैं, वे सिर्फ बुराई के लिए उपयोग किए जा सकते हैं। मुझे लगता है कि बहुत सारे मामले हैं, उदाहरण के लिए, जहां वे सबसे अच्छे समाधान हैं। "गेटोस का उपयोग न करें" एक अच्छी शुरुआत है, लेकिन मुझे लगता है कि कौशल में अगला कदम आपको "लंबी दूरी के गेटोस का उपयोग न करें" की अनुमति देता है। अब तक विकल्पों के सबसे कम सारांश के लिए – Aatch

+1

+1। –

2
for(int i = 0; i < 1000; i++) { 
    for(int j = 0; j < 1000; i++) { 
     if(condition) { 
      goto end; 
    } 
} 

end: 
21
bool stop = false; 
for (int i = 0; (i < 1000) && !stop; i++) 
{ 
    for (int j = 0; (j < 1000) && !stop; j++) 
    { 
     if (condition) 
      stop = true; 
    } 
} 
+0

समाधान अभी भी दोनों चर को _break_ पर बढ़ाता है जो – Thesola10

+2

परेशानी का कारण बन सकता है कोई "रोक = सत्य" सेट कर सकता है; और फिर "ब्रेक;"। फिर, अंदर "लूप" के अंत के ठीक बाद, "अगर (रोकें) तोड़ें;"। –

14

एक तरह से एक समारोह में सभी नेस्टेड छोरों रख दिया और सभी छोरों से बाहर तोड़ने के लिए एक की जरूरत के बैठाना सबसे भीतरी पाश से वापस जाने के लिए है।

function() 
{  
    for(int i=0; i<1000; i++) 
    { 
    for(int j=0; j<1000;j++) 
    { 
     if (condition) 
     return; 
    } 
    }  
} 
+1

मेरे लिए सबसे अच्छा समाधान लगता है –

0
i = 0; 

do 
{ 
    for (int j = 0; j < 1000; j++) // by the way, your code uses i++ here! 
    { 
    if (condition) 
    { 
     break; 
    } 
    } 

    ++i; 

} while ((i < 1000) && !condition); 
11

मुझे लगता है कि goto समस्या

for(int i = 0; i < 1000; i++) { 
    for(int j = 0; j < 1000; i++) { 
     if (condition) { 
      goto end; 
     } 
    } 
} 

end: 
stmt2 
+0

@chikuba मुझे http://www.cprogramming.com/tutorial/goto.html से जवाब मिला और आपका जवाब पोस्ट नहीं किया गया है जब मैं वही कर रहा हूं, इसलिए मुझे आपकी पोस्ट –

3

आप मैं और जे के मूल्यों की जरूरत है, इस लेकिन काम करना चाहिए दूसरों

for(i;i< 1000; i++){  
    for(j; j< 1000; j++){ 
     if(condition) 
      break; 
    } 
    if(condition) //the same condition 
     break; 
} 
+0

क्यों नहीं दिखाई दे रही है ध्यान दें कि यदि स्थिति 'j' पर निर्भर है तो स्थिति के मूल्य को अभी भी काम करने के लिए किसी भी तरीके से संग्रहीत करने की आवश्यकता है। – SuperBiasedMan

+1

आप सही हैं लेकिन ** ब्रेक ** के बाद, ** जे ** का मान नहीं बदलता है और इसी तरह स्थिति का मूल्य भी है। –

0
for(int i = 0; i < 1000; i++) { 
    for(int j = 0; j < 1000; i++) { 
     if(condition) { 
      func(para1, para2...); 
      return; 
     } 
    } 
} 

func(para1, para2...) { 
    stmt2; 
} 
0

सावधानी से कम प्रदर्शन के साथ: इस सवाल का जवाब वास्तव में एक अस्पष्ट निर्माण को दर्शाता है।

यदि आप जीसीसी का उपयोग कर रहे हैं, तो this library देखें। PHP की तरह, break नेस्टेड लूप की संख्या को स्वीकार कर सकते हैं जिन्हें आप बाहर निकलना चाहते हैं। आप कुछ इस तरह लिख सकते हैं:

for(int i = 0; i < 1000; i++) { 
    for(int j = 0; j < 1000; j++) { 
     if(condition) { 
      // break two nested enclosing loops 
      break(2); 
     } 
    } 
} 
संबंधित मुद्दे