В цикле С# (не стесняйтесь отвечать на другие языки), какая разница между break и continue как средство оставить структуру цикла и перейти к следующей итерации?
Пример:
foreach (DataRow row in myTable.Rows)
{
if (someConditionEvalsToTrue)
{
break; //what 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
продолжает выполняться со следующей итерацией.
break заставляет программный счетчик выходить из области самого внутреннего цикла
for(i = 0; i < 10; i++)
{
if(i == 2)
break;
}
Работает как это
for(i = 0; i < 10; i++)
{
if(i == 2)
goto BREAK;
}
BREAK:;
continue переходит в конец цикла. В цикле 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
заставляет меня верить в это, но нуждается в некоторой проверке.
break
полностью остановит цикл foreach
, continue
перейдет к следующему DataRow
.
Есть больше, чем несколько человек, которым не нравятся 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 [Отпечатано] и 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 [Отпечатано] не будет отображаться, так как продолжается, когда я == 3
В качестве примера
foreach(var i in Enumerable.Range(1,3))
{
Console.WriteLine(i);
}
Печать 1, 2, 3 (в отдельных строках).
Добавить условие перерыва при я = 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
переходит к следующей итерации.
Разрыв
Перерыв заставит петлю немедленно выйти.
Продолжить
Это противоречит разрыву. Вместо того, чтобы завершать цикл, он сразу же петли снова, пропуская остальную часть кода.
Continue
не является противоположностью break
, break
останавливает цикл, continue
останавливает текущую итерацию.
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 означает разные вещи в контексте блока.
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 "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.
Так что да. Рубин потрясающий, но в нем есть ужасные угловые шкафы. Это второй худший из тех, что я видел в свои годы: -)
Пожалуйста, позвольте мне изложить очевидное: обратите внимание, что добавление ни перерыва, ни продолжение, возобновит вашу программу; то есть я попал в ловушку за определенную ошибку, а затем после ее регистрации мне захотелось возобновить обработку, и между следующей строкой было еще несколько задач кода, поэтому я просто позволил ей провалиться.
Простой ответ:
Разрыв завершает цикл.
Продолжить начинает обработку следующего элемента. (Если они есть, перепрыгнув на оценочную строку для/while)
Чтобы полностью вырваться из цикла foreach, используется break;
Чтобы перейти к следующей итерации в цикле, используется продолжить;
Разрыв полезен, если вы зацикливаете коллекцию объектов (например, строки в Datatable), и вы ищете конкретное совпадение, когда найдете это совпадение, нет необходимости продолжать через оставшиеся строки, поэтому вы хотите вырваться.
Продолжить полезно, когда вы выполнили то, что вам нужно, на стороне итерации цикла. У вас обычно продолжить после , если.
если вы не хотите использовать break, вы просто увеличиваете значение я таким образом, чтобы оно делало условие итерации ложным и цикл не выполнялся на следующей итерации.
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
}
continue;
остановит обработку текущейrow
и продолжит следующуюrow
из коллекции. С другой стороны,break;
оставит операторforeach
полностью, а остальные строки никогда не будут обработаны.