LuckyMan
> Почему во многих учебниках написано, что goto это такая гадость, никогда не
> используйте?
Потому что много лет назад один антисоветчик по имени Дейкстра, слывший авторитетом, ляпнул глупость, а её подхватили и до сих пор носят, как писаную торбу. Быдлокодерский мейнстрим уже давным-давно скатился в автоматное программирование - такое СГ, с которым по убойности и нечитаемости не сравнится никакое goto. Однако же, goto продолжают травить, а автоматное программирование отчего-то никого не смущает и даже почитается за высший пейлотаж. (Кстати, весьма показательно покаяние на странице обсуждениия некоего Кузнецова Бэ Пэ, бывшего адептом данной "парадигмы" на протяжении 30 лет, и токмо лишь недавно прозревшего - он, как человек учёный, сумел сформулировать внятными словами тот дзен, которые я, простой сермяжный быдлокодер, давным-давно постиг через грабли интуитивно.) Наглядный пример того, как дурные авторитеты подменяют и подавляют в индустрии разум и осознание.
Все за исключением обработки ошибок на C обычно можно переписать без goto и код не раздуется и не станем менее читаемым.
Sbtrn. Devil
> Быдлокодерский мейнстрим уже давным-давно скатился в автоматное программирование
Кстати, там очень удобно использовать goto.
Sbtrn. Devil
> Быдлокодерский мейнстрим уже давным-давно скатился в автоматное
> программирование - такое СГ, с которым по убойности и нечитаемости не сравнится
> никакое goto.
но-но-но-но-но !
КА не трогай, пожалуйста :)
Вот программа написанная без гото. Всё просто логично и понятно, один слой логики
А вот если начать использовать гото, в какой кошмар может превратиться понимание работы и отладка этого гвна
На заре появления C++ некоторые горячие головы решили, что настало время избавиться от препроцессора. В каждом втором учебнике по C++ десятилеьней давности так и было написано - "не используйте макросы, пользуйтесь константами и шаблонами". И многие программисты, начинавшие в те времена, пишут макросы скрипя зубами, ибо постоянно испытывают ощущение, что макросы - это что-то плохое и недостойное для ООП, но они, сцуко, удобные :)
Barabus
Макросы - источник ошибок, поэтому и не рекомендуют.
Лично я макросы люблю.
Я практически не использую goto, не потому что так написано в учебнике или препод в универе сказал. Я не использую его, потому что в большинстве случаев его использовать нет необходимости, и только примерно из 10000 строк кода бывает я вижу случай когда goto это решение всех проблем в короткие сроки, без goto пришлось бы переписывать всю функцию или больше.
Думаю в книжках написано, что он зло по одной причине, проще так написать и все. Если использовать goto часто, то страдает читаемость и отладка. Но есть небольшие плюсы, да все эти случаи решаются и без goto переписыванием кода. Вот поэтому в книжках и пишут что зло.
Самое главное решить это самому, зло или не зло, а что пишут другие, это всего лишь их мнение, Дейкстра он, Вася Пупкин, не имеет значения.
Последний раз использовал goto в бейсике для БК0010
Den Zurin
> Кстати, там очень удобно использовать goto.
Неа. Там, как правило, состояния растасканы по разным функциям.
kvakvs
> Вот программа написанная без гото. Всё просто логично и понятно, один слой
> логики
> А вот если начать использовать гото, в какой кошмар может превратиться
> понимание работы и отладка этого гвна
Начнём с того, что аналогия вопиюще неверная. На картинке - структура элементов, разнесённых в пространстве, а алгоритм - структура элементов, разнесённых во времени.
Ну и во-вторых, если мы изобразим алгоритм в виде блок-схемы (что ты, очевидно, и подразумевал), то - сюрприз! - там нет никаких while, goto и т. п. Там будут просто тупо стрелочки перехода из состояний в состояние. В какую языковую конструкцию они воплотятся - зависит от предпочтений быдлокодера, коему поручат имплементацию алгоритма. В формировании того, что ты нарисовал в качестве "кошмара", использование той или иной конструкции, таким образом, роли решительно не играет, ибо они вторичны. А единственное, что играет роль - вид алгоритма. То бишь, если алгоритм кривой и фейспальмовый, то хоть используй для его имплементации goto, хоть не используй - это не поможет ни в плане читаемости, ни в плане отладки, ни в каком бы то ни было ином плане. А если он кошерен и орхетектурен - опять-таки, хоть используй goto, хоть не используй, он останется читаемым и отлаживаемым. (При условии, конечно, что злобный буратино не старается умышленно усложнить себе жизнь заведомо героическими путями - но тут, опять же, к услугам злобного буратины масса способов героизма, на фоне которых goto далеко не в первых рядах. Например: развёртка рекурсивной программы в итеративную, автоматное программирование, эксклюзивное использование while...)
Sbtrn. Devil
> у и во-вторых, если мы изобразим алгоритм в виде блок-схемы
...то мы увидим что чем меньше в алгоритме пересечений линий, тем проще его понять. И алгоритм без гото - как раз не содержит пересечений. А вот готами легко сделать непланарную хрень, которую вообще не разобрать.
slava_mib
> иногда удобнее написать 1 goto чем извращаться пытаясь обойтись без него.
Сколько писал на це++, но так и не мог вспомнить есть там goto или нет...
Den Zurin
> Обработка исключений в Си. Без goto можно попытаться сделать, но получится
> некрасиво.
setjmp/longump в помощь
CoffeeCoder
> в некоторых языках (C например) без goto не обойтись.
Еще в 80-х доказали, что алгоритм любой сложности можно реализовать без гоу ту...
Почему ГОТО плохо? Потому что получим - спагетти-код - http://ru.wikipedia.org/wiki/Спагетти-код
А вот за упоминание "чем в 10 циклов все запихивать!" Надо бить по головам. Смысл не в том что ГОТО плохо или хорошо. Проблема в том что программист пишет эти самые десять циклов, а это ошибка. То есть если не использовать ГОТО - программист сто раз подумает прежде чем написать конструкции из 3 и более циклов, а если он знает что у него всегда есть магическое зелье GOTO, то он просто забьет и будет писать те самые десять-сто for - читаемость и логика убиваются полностью.