Closed topin89 closed 2 years ago
for(int x=0; x < width; ++x){
for(int y=0; x < heigh; ++y){
if(img[x][y] != 0 ){
break 2;
}
}
}
Это хуже, чем goto
, потому что требует огромной внимательности от того, кому нужно будет добавить третий цикл:
for(int x=0; x < width; ++x){
for(int z=0; z < depth; ++z){
for(int y=0; x < heigh; ++y){
if(img[x][y] != 0 ){
break 2; // oops!
}
}
}
}
А также вынося вложенные циклы в отдельную функцию/лямбду и делая return для выхода из вложенных циклов.
Обычно от этого код становится только понятнее и масштабируемее :-)
Ещё можно подумать, как для такого обхода использовать корутины.
Во многих философских трудах пишут, что многовложенные циклы это code smell, которого нужно избегать. Чаще всего рефакторят тело цикла в отдельные функции.
В таком случае вопрос странсформируется в "как мне выпрыгнуть на N функций вверх", это уже точно никому не должно быть нужно.
Это хуже, чем goto, потому что требует огромной внимательности от того, кому нужно будет добавить третий цикл
Хороший аргумент, согласен.
Тема выхода/продолжения из внешних циклов довольно древняя, и разные языки решали её по разному. В C/C++ её чаще всего решают через
goto
А также вынося вложенные циклы в отдельную функцию/лямбду и делая
return
для выхода из вложенных циклов. Основная проблема сgoto
даже не с читаемостью, а с тем, что можно легко забыть про метки наружу цикла и сами метки должны быть уникальными, что неудобно при копипасте (вопрос о пользе и вреде копипасты не рассматриваем).В других языках не лучше, где-то это специальные метки для
break
, как в Java илиbreak varname
в Visual Basic. Где-то просто никак, например в Python.И есть баш.
Абсолютно простое решение проблемы. Хотим указать, что нам выйти из двух вложенных циклов -- берём и указываем. Заодно решается вопрос, как выйти из цикла внутри
switch
.В нашем случае это выглядело бы так:
Примеров применения множество. Выход из циклов внутри
switch
. Выход из while, в котором мы ждём прихода массива и если нужный элемент найден покидаем ожидание. Если вбить в гуглеc++ outer loop break
, найдётся 31 миллион результатов. 4 миллиона в Яндексе.При этом по стандарту после break и continue не может быть никаких символов кроме
;
и пробелов, шансов нарушить обратную совместимость очень мало