В цикле C # (не стесняйтесь отвечать за другие языки), в чем разница между break и continue в качестве средства выхода из структуры цикла и перехода к следующей итерации?
Пример:
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
полностью остановит foreach
цикл, continue
перейдет к следующему DataRow
.
Действительно простой способ понять это - поместить слово «цикл» после каждого ключевого слова. Термины теперь имеют смысл, если они просто читаются как повседневные фразы.
break
цикл - цикл прерывается и останавливается.
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
необходимости.
Ruby, к сожалению, немного отличается. PS: моя память немного туманна, поэтому извиняюсь, если я ошибаюсь
вместо break / continue, он имеет break / next, который ведет себя одинаково с точки зрения циклов
Циклы (как и все остальное) являются выражениями и «возвращают» последнее, что они сделали. В большинстве случаев получение возвращаемого значения из цикла бессмысленно, поэтому каждый просто делает это
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 означает разные вещи в контексте блока.
перерыв выпрыгнет из кода, который вызвал блок
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(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:;
}
for
цикл, но сработает ли это для while
циклов до и после тестирования ? Запись goto
заставляет меня верить в это, но нужна некоторая проверка. while
(«предварительно протестированный») и do
- while
(«пост-протестированный») после того, как выполнено continue;
утверждение, следующее, что произойдет, - это то, что условие цикла оценивается, чтобы решить, следует ли выполнить дополнительную итерацию. Конечно, break;
если условие цикла не проверено, цикл просто завершается полностью. Так что goto
аналогия хороша для понимания этого аспекта. Простой ответ:
Разрыв немедленно выходит из цикла.
Продолжить начинает обработку следующего элемента. (Если таковые имеются, переходя к линии оценки для / в течение)
Пожалуйста, позвольте мне заявить об очевидном: обратите внимание, что добавление ни прерывания, ни продолжения не возобновит вашу программу; то есть я поймал определенную ошибку, а затем, зарегистрировав ее, захотел возобновить обработку, и между следующей строкой было больше задач с кодом, поэтому я просто позволил ей провалиться.
Все дали очень хорошее объяснение. Я все еще публикую свой ответ, просто чтобы привести пример, если это может помочь.
// 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 [Printed] не будет отображаться, так как есть продолжение, когда я == 3
Чтобы полностью вырваться из цикла foreach, используется break ;
Для перехода к следующей итерации цикла используется продолжить ;
Разрыв полезен, если вы просматриваете коллекцию Объектов (например, Строки в Datatable), и вы ищете конкретное совпадение, когда вы обнаруживаете это совпадение, нет необходимости продолжать просмотр оставшихся строк, поэтому вы хотите разбить вне.
Продолжение полезно, когда вы выполнили то, что вам нужно для выполнения итерации цикла. Вы, как правило, продолжите после if .
Ломать
Разрыв заставляет петлю немедленно выйти.
Продолжить
Это делает противоположность разрыва. Вместо того, чтобы завершать цикл, он немедленно повторяет цикл, пропуская оставшуюся часть кода.
Continue
не является противоположностью break
, break
останавливает цикл, continue
останавливает текущую итерацию. Примером
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
переходит к следующей итерации.
если вы не хотите использовать break, вы просто увеличиваете значение 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
continue;
остановит обработку текущегоrow
и перейдет к следующемуrow
из коллекции. С другой стороны, оператор полностьюbreak;
покинетforeach
оператор, а остальные строки никогда не будут обработаны.