Вопрос

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

Пример:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}
Это было полезно?

Решение

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.

Другие советы

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

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

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

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

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

Работает вот так

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

продолжать переходит в конец цикла.В цикле for continue переходит к выражению приращения.

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:;
}

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

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

Когда использовать перерыв или продолжить?

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

Break

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

Continue

Есть немало людей, которым не нравится break и continue.Последняя жалоба, которую я видел на них, была в JavaScript:Хорошие части Дуглас Крокфорд.Но я считаю, что иногда использование одного из них действительно упрощает задачу, особенно если в вашем языке нет 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 тоже нужно.

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

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

Перерыв

Break заставляет цикл немедленно завершиться.

Продолжать

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

На примере

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 переходит к следующей итерации.

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

вместо прерывания/продолжения у него есть прерывание/следующий, которые ведут себя одинаково с точки зрения циклов

Циклы (как и все остальное) являются выражениями и «возвращают» последнее, что они сделали.В большинстве случаев получение возвращаемого значения из цикла бессмысленно, поэтому все просто делают это.

a = 5
while a < 10
    a + 1
end

Однако вы можете это сделать

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

ОДНАКО, большая часть кода Ruby «эмулирует» цикл, используя блок.Канонический пример:

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.

Так что да.Ruby великолепен, но у него есть ужасные недостатки.Это второй худший вариант, который я видел за годы использования :-)

Простой ответ:

Перерыв немедленно выходит из цикла.
Продолжать начинает обработку следующего элемента.(Если таковые имеются, перейдя к строке оценки for/ while)

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

Чтобы полностью выйти из цикла foreach, перерыв используется;

Чтобы перейти к следующей итерации цикла, продолжать используется;

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

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

если ты не хочешь использовать перерыв вы просто увеличиваете значение 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
}

Что касается других языков:

'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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top