К слову, книга годная. Она очень доступным языком объясняет основы. Ну и хайповое название как маркетинговый ход
Почему все так горят с goto? Я, конечно, не так часто его применял, да и практики у меня не много, но как мне кажется - это лучшее средство для выхода из многоуровневых вложенных циклов.
Легенды гласят, что доисторические программисты с помощью goto превращали код в месиво. Ужасы тех времён отпечатались в нашей ДНК и теперь инстинкты не позволяют осквернять код. Мы в ответе за то, что пишем.
1) он усложняет восприятия кода другими программистами в команде
2) он убивает оптимизацию кода во время компиляции
3) есть другие методы выхода из подпрограмм и циклов
Окей, есть цикл.
for(n; n < 100; n++)
{
met:
for(n1; n1 < 100; n1++)
{
for(n2; n2 < 100; n2++)
{
if(a = b)
goto met;
}
}
}
Как сделать это без goto? Как это сделать, если выйти, например, надо из 6-го цикла в первый?
З.Ы. И нет, я не с целью прям доебаться. Мне действительно интересно, как это можно сделать иначе, так как мало опыта и практики. Использовать bool-флаг и на каждом цикле проверку и выход break?
Если у тебя на одном уровне абстракции такой код - это уже косяк. Попробуй тело каждого цикла обернуть в метод с говорящим названием, и увидишь, насколько лучше стало.
Как правило большая часть адекватного использования goto это приемы для улучшения заведомо плохого кода. Альтернатива - не писать плохой код.
И да, могу порекомендовать Code Complete как лучший сборник ответов на такие вопросы.
Это абстрактный пример, но вообще таких ситуаций лучше не допускать и перестроить логику. Что в таких циклах может вычисляться? Значения в трехмерном массиве?
Так и я не призываю использовать его повсюду, а говорю лишь о частных случаях.
Использовал один раз при кодировании, там был двухмерный массив. Ещё один раз использовал в другой программе. Но там, признаюсь, действительно можно было бы подумать и перестроить логику.
FYI: у вас присваивание вместо сравнения.
Прописываю вам статические анализаторы внутремышечно, запишитесь на контрольный приём через неделю.
Да, набедокурил, признаю. Оправдываюсь: писал с мобильного, психовал на свои жирные пальцы, ошибся.
Кстати, код страшнее, чем кажется на первый взгляд: вы могли бы, смотря на него впервые, предположить, сколько итераций будет во внешнем цикле?
...
Едва ли, ибо условие не явное, а управляется втутренними циклами, условием (a==b) и еще 100 раз повторить все это безобразие.
Близкий к идеальному пример того, что goto - зло.
И это мы еще опустим, что a и b в теле не меняются, поэтому всю эту конструкцию можно либо выкинуть, либо заменить на бесконечный цикл.
Да понятное дело, что код страшнее страшного страха. Я дал неправильный пример, который вообще не обдумывал и писал на коленке (в прямом и переносном смысле). Когда посмотрел на него чуть позже, понял, что он, как и я, отвратителен, но менять что-либо уже было поздно.
Мне просто было интересно, как товарищ предлагает выйти из многоуровневого цикла путём использования "другие методы выхода из ... циклов".
Или использовать break или переделать код, что б не нужен был такой переход. Я сам не дофига умный, лишь озвучил мнение своего друга, который работает тим лидом уже более 3 лет.
Понятно. Значит сегодня вы не открыли для меня ничего нового. Про другие операторы переходов я и так знал, про перестроения логики программы - тоже.
Скриншоты комментов
55.7K поста39.8K подписчиков
Правила сообщества
В сообществе можно размещать ЛЮБЫЕ скрины (комментов) с любого сайта!!
ПРИКРЕПИТЬ ССЫЛКУ НА КОМЕНТ ЕСЛИ ОН С Пикабу желательно, но не обязательно!!!
Если скрин не с пикабу, а со стороннего сайта( Твиттер,. Вк, Одноклассники и т.д.) то ссылка не обязательна.
Для сообщества подходит любой скрин, набранный на клавиатуре, даже если это не диалог (под вид Твита) Так же подходит скрин с картинкой и хотя бы одним комментарием под ним, с любого источника.