Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Выход из цикла while

#cpp #while


У меня есть конструкция 

while(true){
   for(;;) {}
}


Как мне выйти из бесконечного цикла while внутри цикла for?
    


Ответы

Ответ 1



К сожалению, в отличие от Джавы, C и C++ не поддерживают механизм вроде break label, поэтому самый чистый вариант — использовать goto: int main() { while (true) { for (;;) { goto breakAll; } } breakAll: puts("I'm out!"); } Также можно использовать флаг: int main() { bool running = true; // bool определен в stdbool.h while (running) { for (;;) { running = false; break; } } puts("I'm out!"); } Большой разницы между этими вариантами нет. Помимо этого случая, goto также используется в хорошем стиле C для обработки ошибок: bars_t foo() { bar_t *bar1 = malloc(sizeof(*bar1)); if (!bar1) { goto cleanupNothing; } bar_t *bar2 = malloc(sizeof(*bar2)); if (!bar2) { goto cleanupBar1; } // ... return (bars_t) { .one = bar1, .two = bar2 }; // в обратном порядке определения cleanupBar2: free(bar2); cleanupBar1: free(bar1); cleanupNothing: return (bars_t){0}; } В C++ подобное не нужно, т.к. есть RAII, но из циклов по-прежнему выходят через goto.

Ответ 2



Ещё добавлю пару способов. Указанный код выносится в отдельную функцию. И теперь можно выходить по обычному return. Способ два - нужно прост создать переменную флаг. И проверять ее. Где то так bool go = true; while(go){ for(;;) { if (...) { go = false; break;} } Но это плохой способ.

Ответ 3



try { while (true) { for (;;) { throw 1; } } } catch (int) { //вышли из двух вечных циклов одновременно }

Ответ 4



{ while(1) { for(;;) { if(...) goto AWAY; } } AWAY: ; }

Ответ 5



inline bool func(){ bool exit,only_break; for(;;){ if(exit){ return 1; } if(only_break){ break; } } return 0; } int main(){ while(1){ if(func()){ break; } } }

Комментариев нет:

Отправить комментарий