C # петля - перерва проти продовження


797

У циклі C # (не соромтесь відповідати на інші мови), яка різниця між перервою та продовженням як засобом залишити структуру циклу та перейти до наступної ітерації?

Приклад:

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

2
повідомлення в блозі з кульмінацією нижче adamthings.com/post/2012/07/26/…
Адам

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 Мої молодші, дурніші ще не усвідомлювали значення використання брекетів. (Вони не є обов'язковими в C # для окремих висловлювань, але якщо їх не ставити, це полегшує введення помилки пізніше. Також дивіться programmers.stackexchange.com/a/16530/6342 )
Michael 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 for продовжуйте переходи до вираження приросту.

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
@Daniel, для циклів WHILE ви можете використовувати BREAK і CONTINUE, без проблем.
Аміла

@DanielPark Для обох while( «попереднє тестування») і do- while( «пост-тестування»), після того, як continue;заяву задовольняється наступна річ , що буде відбуватися в тому , що умова циклу обчислюється вирішити додаткові ітерації , чи буде зроблено. Звичайно, якщо break;стан циклу не перевіряється, цикл просто виходить повністю. Тож gotoаналогія хороша і для розуміння цього аспекту.
Jeppe Stig Nielsen

37

Я завжди плутався, чи варто використовувати перерву, чи продовжувати. Ось що допомагає мені запам'ятати:

Коли використовувати перерву проти продовження?

  1. Перерва - це як розбитись. Сумно, хлопці, розлучаєтесь. Петля виходить.

Перерва

  1. Продовжувати - означає, що ви сьогодні відпочити і розібратися все завтра (тобто пропустити поточну ітерацію)!

Продовжуйте


Поділюсь цим із моїм партнером. Може бути Continue, слід перейменовувати в GetOverIt, а Break слід перейменувати на MoveOnForward. Недарма нас називають вундеркіндами, як перерва має сенс? Це звучить руйнівно. І те, що потрібно додати, це - STOP або ще краще EndIt - виправить багато помилок і зробить C-strong по-справжньому гострим.
Майк

Знову в потоп. То ж стара поїздка була тоді, тому я зробив велику помилку. Спробуйте побачити це колись моїм шляхом
Талал Захід

@TalalZahid я не розумію?
BKSpurgeon


20

Є більше кількох людей, яким не подобається breakі continue. Остання скарга, яку я бачив щодо них, була в JavaScript: The Good Parts Дугласа Крокфорда. Але я вважаю, що іноді використання одного з них дійсно спрощує речі, особливо якщо у вашій мові немає певного циклу 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 [Надруковані] не відображатимуться, оскільки є перерва, коли i == 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
Продовжуйте перевіряти стан циклу теж :)
Грантлі

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

На жаль, Рубі трохи відрізняється. PS: Моя пам'ять трохи туманна, тому вибачтесь, якщо я помиляюся

замість перерви / продовження, він має break / next, які ведуть себе однаково з точки зору циклів

Цикли (як і все інше) - це вирази, і "повертають" останнє, що вони зробили. Більшу частину часу отримувати повернене значення з циклу безглуздо, тому кожен просто робить це

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

Оскільки людям набагато частіше хочеться робити речі з результатом блоку, саме тут стає брудно. break / next означають різні речі в контексті блоку.

Перерва вискочить з коду, який викликав блок

Далі буде пропущено решту коду в блоці та "повернути" те, що ви вказали, що викликає абонент блоку. Це не має сенсу без прикладів.

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

Щоб повністю вирватися з петлі передбачення, використовується перерва ;

Щоб перейти до наступної ітерації в циклі, використовується продовження ;

Перерва корисна, якщо ви перебираєте колекцію об'єктів (наприклад, рядки в даних) і шукаєте певну відповідність, коли ви знайдете цю відповідність, не потрібно продовжувати її через інші рядки, тому ви хочете зламати з.

Продовжувати корисно, коли ви виконали те, що вам потрібно, щоб уникнути ітерації циклу. Ви, як правило, продовжуватимете після " if" .


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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.