Все постоянно обсирают goto, а мне он кажется очень хорошим другом, который поможет тебе в трудную минуту, но в то же время, как и все, не любит, когда его дергают по пустякам.
Я не сомневаюсь. Рассмотрим примере
for(int i = 0; i < 100; i++) {
for(int j = 0; j < 100; j++) {
if(i + j > 120) {
//выйти из обоих циклов
}
}
}
Решения (которые вижу я)
1. Переписать алгоритм так, чтобы не нужно было использовать вложенный цикл для решения этой задачи.
2. Использовать функцию для решения этой задачи.
3. Дописать в код первого цикла if(flag) { break; } и ставить флаг в true когда хотим выйти из цикла и вызывать break во втором цикле. (изначально flag == false)
4. Переписать первый цикл как (for int i = 0; i < 100 && !flag; i++) и аналогично варианту 3 ставить flag = true.
Эти варианты в случае большей вложенности (не спорю, что множественная вложенность циклов — дурное дело, но бывает, что нужно) циклов заставляют код несколько разрастаться. В функцию засовывать не всегда хочется по той причине, что в функции, где изначально этот код, лишь пара строчек, помимо этого. Не спорю, что можно. Переписать алгоритм не всегда возможно. 3 и 4 вариант заставляют так или иначе разрастаться код.
goto здесь вариант, который не будет добавлять лишних строк кода. Не спорю, что можно обойтись без него, но здесь он вливается вполне себе эстетично, имхо.
Я назвал решения, которые возможны в подавляющем числе языков. Я писал на java, там возможен выход из цикла к метке, в swift, на котором я сейчас пишу, тоже, если память не изменяет. Но далеко не всегда есть подобное решение, и опять же, далеко не всегда приходится писать на языке, который знаешь настолько, чтобы знать тонкости, а это тонкости, если судить по тому, какое количество людей знает про подобные вещи. Кому-то данные вещи покажутся синтаксическим сахаром, однако. Смысл лишь в том, что я вам привел пример, когда goto не является каким-то демоном из ада. Да, в настоящее время в языках программирования он не слишком нужен, однако смысл в том, что сам по себе goto не плох. Просто случилось так, что многие программисты использовали его там, где его нельзя использовать как по соображениям читаемости кода, так и по соображениям безопасности — например, обход инициализации переменной. Сейчас языки, поддерживающие goto, зачастую предоставляют защиту от второй проблемы. Первую же проблему решили радикально - оператор запретили использовать во многих языках. Однако дело не в самом операторе, дело в программистах. В самом операторе нет совершенно ничего плохого, если использовать его так, чтобы не приходилось страдать.
Выход из вложенных циклов (C++), когда циклы выносить в отдельную функцию получится по-уебански. Да и вообще, главное правило применения goto -- не переходить назад. Практически всегда при соблюдении этого правила и прочих равных, всё будет ok .
while: подумал, сделал, подумал, ... сделал, подумал, вышел из цикла.
do while: сделал, подумал, сделал, подумал, ... сделал, подумал, вышел из цикла.
Как уже писали, если до цикла не на краю, разницы нет.
IT-юмор
5.7K поста52.5K подписчиков
Правила сообщества
Не публикуем посты:
1) с большим количеством мата
2) с просьбами о помощи
3) не относящиеся к IT-юмору