सी # लूप - ब्रेक बनाम जारी


797

C # में (अन्य भाषाओं के लिए स्वतंत्र महसूस करने के लिए) लूप, ब्रेक के बीच अंतर क्या है और लूप की संरचना को छोड़ने के साधन के रूप में जारी है, और अगले पुनरावृत्ति पर जाएं?

उदाहरण:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}


8
continue;वर्तमान के प्रसंस्करण को रोक देगा rowऔर संग्रह से अगले के साथ जारी रहेगा row। दूसरी ओर, बयान को पूरी तरह break;से छोड़ देगा foreachऔर शेष पंक्तियों को कभी संसाधित नहीं किया जाएगा।
जेपी स्टिग नीलसन

जवाबों:


1500

breakपूरी तरह से लूप से बाहर निकल जाएगा, continueबस वर्तमान पुनरावृत्ति को छोड़ देगा ।

उदाहरण के लिए:

for (int i = 0; i < 10; i++) {
    if (i == 0) {
        break;
    }

    DoSomeThingWith(i);
}

ब्रेक के कारण लूप पहली यात्रा पर बाहर निकल DoSomeThingWithजाएगा - कभी भी निष्पादित नहीं किया जाएगा। यह इधर:

for (int i = 0; i < 10; i++) {
    if(i == 0) {
        continue;
    }

    DoSomeThingWith(i);
}

निष्पादित नहीं होगा DoSomeThingWithके लिए i = 0है, लेकिन पाश होगा जारी रखने के लिए और DoSomeThingWithके लिए निष्पादित किया जाएगा i = 1करने के लिए i = 9


2
क्यों उनके आसपास कोई ब्रेस जारी नहीं है - मुझे पता है कि यह उनके बिना काम करता है, लेकिन क्यों?
जॉर्ज विलकॉक्स

52
@GeorgeWillcox मेरे छोटे, अधिक मूर्ख स्व ने हमेशा ब्रेसिज़ का उपयोग करने का मूल्य नहीं सीखा था, हमेशा। (वे एक बयान के लिए सी # में वैकल्पिक हैं, लेकिन डाल नहीं उन्हें यह आसान बाद में एक बग को पेश करने में आता है यह भी देखें। Programmers.stackexchange.com/a/16530/6342 )
माइकल Stum

386

यह समझने का एक बहुत आसान तरीका है कि प्रत्येक कीवर्ड के बाद "लूप" शब्द रखा जाए। यदि वे रोज़मर्रा के वाक्यांशों की तरह पढ़े जाते हैं, तो शब्द अब समझ में आते हैं।

break लूप - लूपिंग टूट गया है और बंद हो जाता है।

continue लूप - लूप अगले पुनरावृत्ति के साथ निष्पादित करना जारी रखता है।


105

ब्रेक प्रोग्राम काउंटर को अंतरतम लूप के दायरे से बाहर निकलने का कारण बनता है

for(i = 0; i < 10; i++)
{
    if(i == 2)
        break;
}

इस तरह काम करता है

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto BREAK;
}
BREAK:;

जारी रखने के पाश के अंत में छलांग। लूप के लिए, वृद्धिशील अभिव्यक्ति के लिए कूद जारी रखें।

for(i = 0; i < 10; i++)
{
    if(i == 2)
        continue;

    printf("%d", i);
}

इस तरह काम करता है

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto CONTINUE;

    printf("%d", i);

    CONTINUE:;
}

2
मुझे लगता है कि यहाँ कई लूप्स केवल मानक forलूप का उपयोग करते हैं , लेकिन क्या यह प्री और पोस्ट किए गए whileलूप के लिए काम करेगा ? यह gotoधारणा मुझे ऐसा करने के लिए प्रेरित करती है, लेकिन कुछ सत्यापन की आवश्यकता है।
डैनियल पार्क

1
@ डेनियल, व्हाइल लूप्स के लिए आप BREAK और CONTINUE का उपयोग कर सकते हैं, कोई समस्या नहीं है।
अमिला

@DanielPark दोनों के लिए while("पूर्व-परीक्षण किया गया") और do- while("पोस्ट-परीक्षण किया गया"), एक continue;बयान के बाद अगली बात यह है कि यह होगा कि लूप स्थिति का मूल्यांकन किया जाता है कि क्या एक अतिरिक्त पुनरावृत्ति होना है। बेशक, break;लूप की स्थिति की जांच नहीं की जाती है, लूप बस पूरी तरह से बाहर निकल जाता है। इसलिए gotoइस पहलू को समझने के लिए सादृश्य अच्छा है।
जेपी स्टिग नीलसन

37

मैं हमेशा उलझन में रहता था कि क्या मुझे ब्रेक का उपयोग करना चाहिए, या जारी रखना चाहिए। यह वही है जो मुझे याद रखने में मदद करता है:

विराम का उपयोग कब करें जारी रखें?

  1. तोड़ना - तोड़ना जैसा है। यह दुखद है, आप लोग बिदाई कर रहे हैं। पाश बाहर हो जाता है।

टूटना

  1. जारी रखें - इसका मतलब है कि आप आज आराम देने वाले हैं और कल को सभी को छाँट लेंगे (यानी वर्तमान पुनरावृत्ति छोड़ें)!

जारी रखें


इसे अपने साथी के साथ साझा करेंगे। हो सकता है जारी रखें GetOverIt का नाम बदल दिया जाए और MoveOnForward का नाम बदल दिया जाए। कोई आश्चर्य नहीं कि हमें गीक्स कहा जाता है, ब्रेक का कोई मतलब नहीं है? यह विनाशकारी लगता है। और एक को जोड़ने की जरूरत है - STOP, या इससे भी बेहतर EndIt - कई कीड़े को ठीक कर देगा, और सी-शार्प को वास्तव में तेज बना देगा।
माइक

बाढ़ में फिर से वही पुरानी यात्रा वापस आ गई थी, इसलिए मैंने एक बड़ी गलती की, इसे एक बार मेरे रास्ते में देखने की कोशिश करें
तलाल जाहिद

@ तलालजाहिद मुझे समझ में नहीं आता?
BKSpurgeon

28

breakforeachपाश को पूरी तरह से रोक देगा , continueअगले पर छोड़ देगा DataRow


20

कुछ से अधिक लोग हैं जो पसंद नहीं करते हैं breakऔर continue। नवीनतम शिकायत मैंने उनके बारे में देखी थी : डगलस क्रॉकफोर्ड द्वारा जावास्क्रिप्ट: द गुड पार्ट्स । लेकिन मुझे लगता है कि कभी-कभी उनमें से एक का उपयोग करना वास्तव में चीजों को सरल करता है, खासकर यदि आपकी भाषा में लूप की शैली do-whileया do-untilशैली शामिल नहीं है ।

मैं breakउन लूपों में उपयोग करना चाहता हूं जो किसी चीज़ के लिए एक सूची खोज रहे हैं। एक बार मिल जाने के बाद, जारी रखने का कोई मतलब नहीं है, इसलिए आप छोड़ सकते हैं।

मैं continueकिसी सूची के अधिकांश तत्वों के साथ कुछ करते समय उपयोग करता हूं , लेकिन फिर भी कुछ को छोड़ना चाहता हूं।

breakबयान में यह भी किसी व्यक्ति या वस्तु से एक वैध प्रतिक्रिया के लिए काम जब मतदान में आता है। के बजाय:

Ask a question
While the answer is invalid:
    Ask the question

आप कुछ दोहराव और उपयोग को समाप्त कर सकते हैं:

While True:
    Ask a question
    If the answer is valid:
        break

do-untilपाश कि मैंने पहले उल्लेख किया है कि विशेष समस्या के लिए और अधिक सुरुचिपूर्ण समाधान है:

Do:
    Ask a question
    Until the answer is valid

कोई दोहराव, और कोई breakजरूरत नहीं है।


13

सभी ने बहुत अच्छी व्याख्या दी है। मैं अभी भी अपना जवाब पोस्ट कर रहा हूँ बस एक उदाहरण दे सकता हूँ अगर वह मदद कर सकता है।

// break statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break; // It will force to come out from the loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

यहाँ उत्पादन है:

0 [मुद्रित] 1 [मुद्रित] 2 [मुद्रित]

इसलिए 3 [मुद्रित] और 4 [मुद्रित] प्रदर्शित नहीं किया जाएगा क्योंकि जब मैं == 3 होता है तो वहां विराम होता है

//continue statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        continue; // It will take the control to start point of loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

यहाँ उत्पादन है:

0 [मुद्रित] 1 [मुद्रित] 2 [मुद्रित] 4 [मुद्रित]

तो 3 [मुद्रित] प्रदर्शित नहीं किया जाएगा क्योंकि वहाँ जारी है जब i == 3


7

टूटना

ब्रेक एक पाश को तुरंत बाहर निकलने के लिए मजबूर करता है।

जारी रखें

यह विराम के विपरीत है। लूप को समाप्त करने के बजाय, यह तुरंत फिर से लूप करता है, बाकी कोड को लंघन करता है।


1
लूप की स्थिति को भी जारी रखें :)
22

1
Continueके विपरीत नहीं है break, breakलूप को continueरोकता है, वर्तमान पुनरावृत्ति को रोकता है।
स्टीवन

6

सरल उत्तर:

ब्रेक तुरंत लूप को बाहर निकालता है।
जारी रखें अगले आइटम को संसाधित करना शुरू करें। (यदि कोई हो, तो / जबकि / के मूल्यांकन लाइन पर कूद कर)


6

उदाहरण द्वारा

foreach(var i in Enumerable.Range(1,3))
{
    Console.WriteLine(i);
}

प्रिंट 1, 2, 3 (अलग-अलग लाइनों पर)।

I = 2 पर एक ब्रेक की स्थिति जोड़ें

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        break;

    Console.WriteLine(i);
}

अब लूप 1 प्रिंट करता है और बंद हो जाता है।

विराम को जारी रखें।

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        continue;

    Console.WriteLine(i);
}

अब लूप प्रिंट 1 और 3 (2 लंघन)।

इस प्रकार, breakलूप को रोकता है, जबकि continueअगले पुनरावृत्ति को छोड़ देता है।


5

रूबी दुर्भाग्य से कुछ अलग है। पुनश्च: अगर मैं गलत हूं तो मेरी स्मृति इस पर क्षमा याचना करने योग्य है

ब्रेक / जारी रखने के बजाय, इसमें ब्रेक / अगला है, जो छोरों के संदर्भ में समान व्यवहार करता है

लूप्स (हर चीज की तरह) भाव हैं, और आखिरी चीज जो उन्होंने की थी उसे "वापस" करें। अधिकांश समय, लूप से रिटर्न वैल्यू प्राप्त करना व्यर्थ है, इसलिए हर कोई बस यही करता है

a = 5
while a < 10
    a + 1
end

हालाँकि आप ऐसा कर सकते हैं

a = 5
b = while a < 10
    a + 1
end # b is now 10

फिर भी, बहुत सारे रूबी कोड एक ब्लॉक का उपयोग करके एक लूप का 'अनुकरण' करते हैं। विहित उदाहरण है

10.times do |x|
    puts x
end

जैसा कि लोगों के लिए ब्लॉक के परिणाम के साथ चीजें करना चाहते हैं, यह बहुत आम है, यह वह जगह है जहां यह गड़बड़ हो जाता है। किसी खंड के संदर्भ में विभिन्न चीजों को तोड़ना

ब्रेक कोड से बाहर कूद जाएगा जिसे ब्लॉक कहा जाता है

अगला ब्लॉक में बाकी कोड को छोड़ देगा, और ब्लॉक के कॉलर को जो आप निर्दिष्ट करेंगे उसे 'वापस' कर देंगे। यह उदाहरण के बिना कोई मतलब नहीं है।

def timesten
    10.times{ |t| puts yield t }
end


timesten do |x|
   x * 2
end
# will print
2
4
6
8 ... and so on


timesten do |x|
    break
    x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped

timesten do |x|
    break 5
    x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5

timesten do |x|
    next 5
    x * 2
end 
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.

तो हाँ। रूबी कमाल है, लेकिन इसमें कुछ भयानक कोने-मामले हैं। यह दूसरा सबसे बुरा है जिसे मैंने अपने उपयोग के वर्षों में देखा है :-)


5

कृपया मुझे स्पष्ट बताएं: ध्यान दें कि न तो ब्रेक को जोड़ना और न ही जारी रखना, आपके कार्यक्रम को फिर से शुरू करेगा; यानी मैं एक निश्चित त्रुटि के लिए फंस गया, फिर इसे लॉग इन करने के बाद, मैं प्रसंस्करण फिर से शुरू करना चाहता था, और अगली पंक्ति के बीच में और अधिक कोड कार्य थे, इसलिए मैंने अभी इसे गिरने दिया।


3

एक फॉर्च लूप से पूरी तरह से बाहर निकलने के लिए, ब्रेक का उपयोग किया जाता है;

लूप में अगले पुनरावृत्ति पर जाने के लिए, जारी रखा जाता है;

ब्रेक उपयोगी है यदि आप ऑब्जेक्ट्स के संग्रह के माध्यम से लूप कर रहे हैं (जैसे कि एक डेटा में पंक्तियाँ) और आप एक विशेष मैच की खोज कर रहे हैं, जब आप उस मैच को ढूंढते हैं, तो शेष पंक्तियों के माध्यम से जारी रखने की कोई आवश्यकता नहीं है, इसलिए आप ब्रेक करना चाहते हैं बाहर।

जब आप एक पाश पुनरावृत्ति पक्ष में की जरूरत है क्या पूरा किया है जब जारी है उपयोगी है। आप आम तौर पर होगा जारी रखने के लिए एक के बाद यदि


2

अगर आप ब्रेक का उपयोग नहीं करना चाहते हैं तो आप I के मूल्य को इस तरह से बढ़ा सकते हैं कि इससे पुनरावृत्ति की स्थिति झूठी हो जाएगी और अगले पुनरावृत्ति पर लूप निष्पादित नहीं होगा।

for(int i = 0; i < list.Count; i++){
   if(i == 5)
    i = list.Count;  //it will make "i<list.Count" false and loop will exit
}

0

अन्य भाषाओं के लिए के रूप में:

'VB
For i=0 To 10
   If i=5 then Exit For '= break in C#;
   'Do Something for i<5
next

For i=0 To 10
   If i=5 then Continue For '= continue in C#
   'Do Something for i<>5...
Next
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.