Цикл C # - разрыв против продолжения - PullRequest
742 голосов
/ 09 августа 2008

В цикле C # (не стесняйтесь отвечать за другие языки), в чем разница между break и continue в качестве средства выхода из структуры цикла и перехода к следующей итерации?

Пример:

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

Ответы [ 15 ]

1409 голосов
/ 09 августа 2008

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.

376 голосов
/ 09 августа 2008

Действительно простой способ понять это - поместить слово «цикл» после каждого ключевого слова. Термины теперь имеют смысл, если они просто читаются как повседневные фразы.

break цикл - цикл прерывается и останавливается.

continue цикл - цикл продолжает выполняться со следующей итерации.

97 голосов
/ 20 августа 2008

break заставляет программный счетчик выпрыгнуть из области самого внутреннего цикла

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

Работает так

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

продолжить переход к концу цикла. В цикле 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:;
}
25 голосов
/ 09 августа 2008

break полностью остановит цикл foreach, continue перейдет к следующему DataRow.

23 голосов
/ 06 декабря 2017

Раньше я всегда запутывался, должен ли я использовать перерыв или продолжить. Вот что помогает мне вспомнить:

Когда использовать break vs continue?

  1. Перерыв - это как расставание. Грустно, вы, ребята, расстаетесь.

Break

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

Continue

19 голосов
/ 09 августа 2008

Есть несколько человек, которым не нравятся 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 голосов
/ 21 декабря 2010

Все дали очень хорошее объяснение. Я все еще публикую свой ответ, чтобы привести пример, если это поможет.

// 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 [Отпечатано] не будет отображаться, поскольку есть продолжение, когда я == 3

7 голосов
/ 28 марта 2013

Перерыв

Перерыв заставляет цикл немедленно выйти.

Продолжить

Это противоположно разрыву. Вместо того, чтобы завершать цикл, он немедленно повторяет цикл, пропуская остальную часть кода.

6 голосов
/ 10 октября 2013

К примеру

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 голосов
/ 23 марта 2009

Пожалуйста, позвольте мне заявить об очевидном: обратите внимание, что добавление ни прерывания, ни продолжения не возобновит вашу программу; то есть я поймал в ловушку определенную ошибку, а затем, зарегистрировав ее, захотел возобновить обработку, и между следующей строкой было больше задач с кодом, поэтому я просто позволил ей упасть.

...