Можно ли использовать break
функцию для выхода из нескольких вложенныхfor
циклов?
Если так, как бы вы поступили? Можете ли вы также контролировать, сколько петель break
выходов?
c++
for-loop
break
nested-loops
Faken
источник
источник
Ответы:
AFAIK, C ++ не поддерживает циклы именования, как Java и другие языки. Вы можете использовать goto или создать значение флага, которое вы используете. В конце каждого цикла проверьте значение флага. Если установлено значение true, вы можете выйти из этой итерации.
источник
goto
если это лучший вариант.goto
: плохие программисты и прагматичные программисты. Первые говорят сами за себя. Последний, в который вы бы вписались, если вы решите использовать их хорошо, использует так называемую «злую» концепцию, когда это меньшее из (двух) зол. Прочитайте это для лучшего понимания некоторых концепций C ++, которые вам, возможно, придется время от времени использовать (макросы, goto, препроцессор, массивы): parashift.com/c++-faq-lite/big-picture.html#faq-6.15goto
редко когда-либо является лучшим вариантом. Почему бы не поставить петли в их собственную функцию (inline
если вы беспокоитесь о скорости) иreturn
из этого?Нет, не портите это
break
. Это последний оставшийся оплот для использованияgoto
.источник
Просто чтобы добавить явный ответ, используя лямбды:
Конечно, этот шаблон имеет определенные ограничения и, очевидно, только C ++ 11, но я думаю, что он весьма полезен.
источник
Другой подход к разрыву вложенного цикла состоит в том, чтобы выделить оба цикла в отдельную функцию, и
return
из этой функции, когда вы хотите выйти.Конечно, это приводит к другому аргументу о том, следует ли вам когда-либо явно
return
из функции где-либо, кроме как в конце.источник
continue_processing
), которые контролировали выполнение блоков кода ниже в функции.перерыв будет выходить только из самого внутреннего цикла, содержащего его.
Вы можете использовать GoTO чтобы выйти из любого числа циклов.
Конечно, Гото часто считается вредным .
Использование break и goto может затруднить рассуждение о правильности программы. Смотрите здесь для обсуждения этого: Дейкстра не была безумной .
источник
break
илиreturn
.break
иreturn
имейте преимущество перед тем,goto
что вам не нужно охотиться за лейблом, чтобы найти, куда они идут. Да, под ними какие-тоgoto
, но очень ограниченные. Их гораздо легче расшифровать с помощью мозга, сопоставляющего шаблоны, чем неограниченныйgoto
. Так что имо они предпочтительнее.goto
.Хотя этот ответ уже был представлен, я думаю, что хороший подход заключается в следующем:
источник
gotoMainLoop
каждый цикл проверяетсяgoto
делает ядро более читабельным и более производительным.Как насчет этого?
источник
Пример кода с использованием
goto
метки для выхода из вложенного цикла:источник
Хороший способ вырваться из нескольких вложенных циклов - это преобразовать код в функцию:
источник
goto может быть очень полезным для разрыва вложенных циклов
источник
из MSDN .
источник
Я действительно думаю, что это
goto
справедливо в следующих обстоятельствах:Чтобы смоделировать
break
/continue
, вы хотите:Перерыв
Продолжать
источник
i
. Следовательно,i++
до переходаДругие языки, такие как PHP, принимают параметр для разрыва (то есть, для разрыва 2;), чтобы указать количество уровней вложенных циклов, из которых вы хотите разорвать, однако C ++ этого не делает. Вы должны будете решить это, используя логическое значение, которое вы установили в false перед циклом, установите значение true в цикле, если вы хотите разорвать, плюс условный разрыв после вложенного цикла, проверяя, было ли логическое значение установлено в true и сломаться, если да.
источник
Я знаю, что это старый пост. Но я бы предложил немного логичный и более простой ответ.
источник
j = conditionj
не будет работать, если вместо вас есть сложный предикатj < conditionj
.Разбейте любое количество циклов только одной
bool
переменной, см. Ниже:В этом коде мы
break;
все циклы.источник
Я не уверен, стоит ли это того, но вы можете эмулировать именованные циклы Java с помощью нескольких простых макросов:
Пример использования:
Другой пример:
источник
источник
Вы можете использовать попробовать ... поймать.
Если вам нужно разорвать несколько петель одновременно, это все равно часто является исключением.
источник
Выход из цикла for немного странен для меня, поскольку семантика цикла for обычно указывает на то, что он будет выполняться определенное количество раз. Тем не менее, это не плохо во всех случаях; если вы ищете что-то в коллекции и хотите сломать ее после того, как найдете ее, это полезно Однако выход из вложенных циклов в C ++ невозможен; это на других языках с помощью помеченного перерыва. Вы можете использовать ярлык и перейти, но это может вызвать у вас изжогу ночью ..? Похоже, лучший вариант, хотя.
источник