Если я использую break
оператор, он нарушит только внутренний цикл, и мне нужно использовать какой-то флаг, чтобы разорвать внешний цикл. Но если много вложенных циклов, код будет выглядеть плохо.
Есть ли другой способ разорвать все петли? (Пожалуйста, не используйте goto stmt
.)
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; j++) {
if(condition) {
// both of the loops need to break and control will go to stmt2
}
}
}
stmt2
c
nested-loops
break
user966379
источник
источник
Ответы:
Использование:
источник
const int count =1000
в глобальном файле Initialization. или как#define
макрос.Нет, не портите удовольствие
break
. Это последнее оставшееся допустимое использованиеgoto
;)В противном случае вы могли бы использовать флаги для выхода из глубоких вложенных циклов.
Другой подход к выходу из вложенного цикла состоит в том, чтобы выделить оба цикла в отдельную функцию и вернуться из этой функции, когда вы захотите выйти.
Обобщенно - для выхода из вложенных циклов:
goto
Не удержался и включил сюда xkcd :)
источник
Гото считаются вредными, но, как полагают многие в комментариях, это не обязательно. При разумном использовании он может стать отличным инструментом. Все, что используется в умеренных количествах, - это весело.
источник
источник
Один из способов - поместить все вложенные циклы в функцию и вернуться из самого внутреннего цикла, если необходимо выйти из всех циклов.
источник
Думаю
goto
решу проблемуисточник
Вам понадобится логическая переменная, если вы хотите, чтобы она была удобочитаемой:
Если вы хотите, чтобы он был менее читабельным, вы можете присоединиться к логической оценке:
В качестве окончательного способа вы можете аннулировать начальный цикл:
источник
Воспользуйтесь этим мудрым советом от команды LLVM:
«Превратите циклы предикатов в функции предикатов»
Видеть:
http://llvm.org/docs/CodingStandards.html#turn-predicate-loops-into-predicate-functions
источник
Внимание! Этот ответ показывает действительно непонятную конструкцию.
Если вы используете GCC, проверить эту библиотеку . Как и в PHP,
break
может принимать количество вложенных циклов, из которых вы хотите выйти. Можно написать примерно так:источник
goto
:)goto
) намного предпочтительнее встроенного asm (зависит от машины, проще ошибиться, сложнее читать ...).источник
Если вам нужны значения i и j, это должно работать, но с меньшей производительностью, чем другие
источник
j
то значение условия необходимо каким-то образом сохранить, чтобы это все еще работало.for (int i = 0; i < 1000; i++) { for (int j = 0; j < 1000; j++) { if (workComplete[i][j]) break; /* do work */ workComplete[i][j] = true; } if (workComplete[i][j]) break; ... }
будет всегда вырваться из внешнего цикла после первой итерации внутреннего цикла.Разорвите обе петли.
источник
источник
condition
становится ложным. Да, и второй цикл будет работать вечно, потому что он увеличивается,i
а неj
, упс ...источник