Оператор goto: что это, зачем необходимо и где применяется
Оператор goto применяется в основном в прикладном или системном программировании на высокоуровневых языках, которые поддерживают разбивку кода на структуру и структурную обработку исключений:
- Java;
- C#;
- C++;
- C;
- Python;
- и др.
Это довольно спорный оператор, и по сей день ведется много дискуссий по поводу необходимости его применять. Так происходит, потому что мотивы его применения при разном подходе программирования очень сильно отличаются.
Оператор goto нужен в тех случаях, когда по каким-то причинам необходимо осуществить безусловный переход к определенной точке в коде программы, как правило, эта точка обозначается номером строки или меткой. Поэтому в основном этот оператор состоит из 2-х частей:
- Самого оператора goto;
- Метки. В основном метка goto — это какое какое-то число, но в некоторых языках это может быть абсолютно любой идентификатор.
Основная цель этого оператора заключается в том, что он определяет порядок исполнения программы. То есть программа будет исполняться сразу после метки goto.
Можно постараться обобщить свойства goto:
- Вообще не структурирован. То есть он может применяться в абсолютно любом месте кода, место его применения ни от чего не зависит.
- Может сгруппировать исходный код. Если есть структура кода, то в принципе можно оперировать блоками кода по-разному: переставлять их местами, как в конструкторе ЛЕГО. Однако если применить оператор goto, то «конструктор» с блоками будет практически невозможен, потому что это способно напрочь сломать программу.
Применениеgoto в коде программы в первую очередь влияет на качество самого кода и на его компоненты. Поэтому применение goto должно быть хорошо обдуманным, а возможно, даже проще найти какие-нибудь более безопасные альтернативы.
Оператор goto в современном программировании — часто в более «древних» языках, таких как Basic или Fortan, реже он используется в Си. В более современных языках его стараются не использовать, потому что существуют альтернативные и более эффективные методы:
- использование циклов;
- внедрение обработчиков исключений;
- деструкторы;
- и др.
Раньше оператор goto активно применяли, особенно в Си. Но современное программирование очень усложнилось, и его применение стало нецелесообразно. Многие современные программисты замечают, что применение goto дает неконтролируемую возможность «прыгать по коду». А когда код разрастается, то получается эффект «spaghetti». «Spaghetti-код» — это код, который очень сильно запутан и закручен, что напоминает одноименное блюдо.
Поэтому есть общая рекомендация по применению этого оператора:
Применять оператор goto можно только при условии, когда на это есть очень веская причина, а поиск альтернативных методов не принес никаких результатов.
Схожие статьи
Другое
Для чего нужен Java и в чем он принципиально хорош
Другое
Как вытащить диск из Макбука? Извлечение CD- и DVD-дисков из Mac
Другое
MVC: что это такое, в чем отличия между фреймворком и архитектурой
Другое
Рейтинг суперкомпьютеров: топ-500 суперкомпьютеров мира в истории
GOTO — Неолурк
10 SIN |
Роботы о сабже. |
Сферичнее только 10 GOTO 10
GOTO (гоу ту, бдлкдр. гото) — слитное написание английского go to, что переводится как «иди к…» либо «иди на…», оператор безусловного перехода к указанной после него метке/строке программы. Причина лютых срачей между программистами. Споры на тему «дозволено ли GOTO или нет» (можно ли ТАКОЕ употреблять в программах) идут с самого начала существования структурного программирования.
При ненадлежащем использовании в коде этот самый код становится непонятен даже создателю. При годном использовании может сильно облегчить код и исключить использование более сложных конструкций. Собственно срач подразумевает первый случай использования.
Содержание
- 1 10
- 2 20 GOTO 60
- 3 30 Срач
- 4 40 На самом деле
- 5 50 GOTO 80
- 6 60 Суть
- 7 70 GOTO 30
- 8 80 См. также
- 9 90 Ссылки
- 10 100 END ELSE GOTO 10
Как пользоваться оператором GOTO? Подскажите, пожалуйста. А то друг подарил книгу — самоучитель С++, а страница с goto — вырвана. |
Вы удивитесь, но первый троллинг GOTO возник ещё в 1968 году, когда Эдсгер Дейкстра написал высер «Go To Statement Considered Harmful» («Оператор GOTO считается опасным»). Прочесть его крайне рекомендуется — там тонны лулзов (несмотря на то, что переводил явно надмозг). Чего только стоит первое же предложение: «За многие годы я утвердился во мнении о том, что квалификация программистов — функция, обратно зависящая от частоты появления операторов go to в их программах».
Еще более доставляет тот факт, что фраза «Considered Harmful» сама по себе стала мемом. Так, ответ на статью Дейкстры назывался «’GOTO Considered Harmful’ Considered Harmful», ответ на неё назывался «’„GOTO Considered Harmful“ Considered Harmful’ Considered Harmful?» и так далее (всего 78 (!) статей с данной фразой).
Вообще, в двух словах критика GOTO выражается очень просто: «Хуй поймешь, в каком порядке выполняется этот код». Отладка кода, щедро усыпанного GOTO, напоминает распутывание клубка ниток, причем состоящего из разных кусочков ниток, которые надо собрать в определенном порядке. Кстати, согласно этому оператору, данную статью следует читать начиная со второго раздела, а потом перейти к первому, и если вы это читаете, не прочтя первый, то вы ламер, лол.(пруф линк)(факты=}лузлы)goto…
Кстати, если хотите на своем опыте понять проблему GOTO, попробуйте добавить в эту статью новый раздел, сохранив корректность всех GOTO-ссылок.
Так вот, упомянутый во втором разделе язык Basic подвергался отдельной критике Дейкстры: «Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации». А ещё он назвал копирования отечественными компостроителями архитектуры IBM «Величайшей диверсией Запада против СССР», и, ЧСХ, отчасти оказался прав!
Вернемся к GOTO. Любопытный факт: несмотря на массовую нелюбовь, он есть в большинстве современных языков программирования. И выстрелить себе в ногу с его помощью могут многие, под здоровый смех более просветленных быдлокодеров. Но, что интересно, оператор GOTO имеется в исходниках весьма популярных программ, вроде ядра линукса или гугловского «Андроида», более того, сам Линус одобряет использование GOTO в языках программирования не таких дурацких, как Pascal. Почему? Потому что существуют редкие случаи, когда его использование несколько упрощает код. Другое дело, что использование его вне этих случаев немедленно приводит к полному пиздецу. Впрочем, случаи этого в последнее время не так уж часты — вероятно, по той причине, что многие ньюфаги, не знавшие раннего Бейсика, просто не знают о том, что такой оператор существует (для PHP-быдла он, как правило, и не нужен, потому что там редко встретишь сколь-либо сложные алгоритмы).
Все это, однако, не мешает периодически выходить новым статьям, доказывающим или опровергающим то, о чем Дейкстра и его оппоненты написали полвека назад. Под любой такой статьей немедленно начинается спор между GOTO-фагами и GOTO-ненавистниками. Вторые обычно аргументируют «GOTO нельзя, потому что GOTO нельзя, и вообще можно ту же задачу решить без него», а первые осторожно замечают, что иногда это все-таки можно (если не прыгать вверх по программе), к тому же в некоторых языках не хватает адекватных заменителей, а на этих языках по-прежнему пишется код. Например, выход из многовложенных циклов на Си — можно извращаться с return-ами или делать флаги выхода, но, бля… А можно и не извращаться: по правилам структурного программирования break и вложенные циклы строго запрещены, потому что это сводит читаемость кода (и, как следствие, его работоспособность) к нулю. Про бесконечный цикл while(true) вообще молчим. Правильный вариант — использование функций, возвращающих false в случае, если нужно срочно выйти из цикла.
Но надо сказать, что современные языки с GOTO все-таки стараются ограничить его применение — так, обычно нельзя так просто прыгать между функциями. Так что GOTO уже не тот, что был раньше. Но мы помним!
40 На самом деле[править]
На самом деле, GOTO — это единственный оператор, который используется для управления выполнением кода этими вашими центральными процессорами. Для всякого ЦП есть в сущности два способа управлять кодом: условный оператор (если да, то выполнить следующую команду, иначе выполнить послеследующую) и перейти на другой участок кода (GOTO). Всё. И все эти ваши процедурное программирование, функциональное программирование, ООП, ААП, замыкания, циклы и прочая синтаксическая ересь — после компиляции превращается в сотни, тысячи, миллионы GOTO (а точнее, в JMP, JE, JLE, JGE, JNE, etc.), я гарантирую это! Несогласные goto 30
Последствия использования
Оператор GOTO — древнейший оператор. Используется он для безусловного перехода из одной точки кода в другую. До появления процедур и функций был по сути единственным способом запустить один и тот же код несколько раз. В x86-ом ассемблере этому оператору соответствует JMP.
Люди, начинавшие программировать на раннем Basic’е, безусловно помнят, что каждая строчка на нем нумеровалась (10, 20 и т. д.). Соответственно, написав GOTO 10, можно было скакнуть в самое начало программы. Или ещё куда-нибудь. Многие ранние версии Бейсика позволяли вычисляемый GOTO (хоть от функции RND или INPUT), а иногда в таком лапидарном виде:10 RUN. В более современных языках появились символьные метки, так что стало возможным писать
- Рекурсия
- Пункт А
- Пункт Б
- GoTo ЖиВ!
100 END ELSE GOTO 10[править]
0: «Действительный код причины еще не получен» | Указывает, что стандартный код причины 1-127 не был получен из-за сложного сценария вызова. |
1: «Нераспределенный номер» | Указывает, что вызываемая сторона не может быть достигнута, так как номер вызываемой стороны в настоящее время не маршрутизируется. |
16: «Обычный сброс вызова» | Указывает, что вызов прерван одной из вовлеченных сторон. В обычных ситуациях источником этой причины является не сеть. Звонок поступает нормально, но причины могут быть следующие:
|
17: «Пользователь занят» | Указывает, что вызываемая сторона не может принять другой вызов, поскольку возникло состояние занятости пользователя. |
19: «Нет ответа от пользователя (пользователь предупрежден)» | Указывает, что вызываемая сторона была предупреждена, но не ответила в течение заданного периода времени. Эта причина может быть вызвана внутренними сетевыми таймерами. |
20: «Абонент отсутствует» | Указывает, что пользователь/устройство временно не адресуется. Это может быть связано с тем, что расширение больше не существует или устройство не зарегистрировано. |
21: «Вызов отклонен» | Указывает, что пользователь или системный параметр, заданный пользователем, например, «Не беспокоить», отклонил вызов от ответа. |
22: «Номер изменен» | Указывает, что номер, набранный вызывающей стороной, больше не назначен. |
26: «Очистка невыбранного пользователя» | Указывает, что пользователь не получил входящий вызов. Это может произойти при настройке группы вызова, когда несколько пользователей звонят, но только один из них отвечает на вызов. Этот код будет отображаться для пользователей, которые не ответили на звонок. |
27: «Пункт назначения не работает» | Указывает, что место назначения, указанное пользователем, недостижимо, так как интерфейс назначения работает неправильно. Термин «работает неправильно» указывает на то, что сигнальное сообщение не может быть доставлено удаленной стороне; например, сбой физического уровня или уровня канала передачи данных на удаленной стороне или пользовательское оборудование отключено. |
28: «Неверный формат номера (адрес неполный)» | Указывает, что вызываемая сторона не может быть достигнута, поскольку номер вызываемой стороны имеет недопустимый формат или не является полным. |
29: «Учреждение отклонено» | Эта причина возвращается, когда дополнительная услуга, такая как сторонний автосекретарь, запрошенный пользователем, не может быть предоставлена сетью. |
34: «Нет доступной цепи/канала» | Указывает, что в настоящее время нет подходящего канала/канала для обработки вызова. Это может происходить из-за того, что на обеих сторонах вызова имеется цепь с максимальной пропускной способностью. |
38: «Сеть вышла из строя» | Указывает, что сеть, соединяющая вызывающего и вызываемого абонентов, работает неправильно. |
44: «Запрошенный канал/канал Н/Д» | Эта причина возвращается, когда другая сторона интерфейса не может предоставить канал или канал, указанные запрашивающим объектом. |
58: «Возможность переноса недоступна» | Указывает, что пользователь запросил возможность переноса, которая в настоящее время недоступна. Возможности переноса — это когда вызывающая система запрашивает атрибуты связи канала в начале вызова, через который осуществляется связь. |
102: «Восстановление по истечении таймера» | Указывает, что процедура инициирована по истечении таймера в связи с процедурами обработки ошибок. Это часто связано с проблемами NAT. |
111: «Ошибка протокола, не указана» | Сообщает об ошибке протокола только в том случае, если никакая другая причина в классе ошибок протокола не применима. |
127: «Взаимодействие, не указано» | Указывает, что вызов взаимодействия (обычно вызов службы SW56) завершен. |
Почему я получаю предупреждения об отсутствии блоков GoTo и From при использовании блока IGBT (и других подобных блоков SimPowerSystems… — MATLAB Answers
45 просмотров (последние 30 дней)
Отредактировано: команда поддержки MathWorks 14 февраля 2014 г.
Принятый ответ: Группа поддержки MathWorks
Почему я получаю предупреждения об отсутствии блоков GoTo и From при использовании блока IGBT (и других подобных блоков SimPowerSystems) в моей модели в R13?
Когда я запускаю свою модель с блоками IGBT или Asynchronous Machine (или другими блоками SimPowerSystems), я получаю следующие предупреждения в командной строке MATLAB:
Предупреждение: Сопоставление блока «Goto» для блока «From» ‘dcbustctrl_igbt/Asynchronous Machine Единицы СИ1/От’ не найдены.
Предупреждение: Соответствие блока «От» для блока «Перейти» ‘dcbustctrl_igbt/Единицы СИ1 асинхронной машины/Переход’ не найдено.
Предупреждение: Соответствие блока «From» для блока «Goto» «dcbustctrl_igbt/IGBT/Goto» не найдено.
Предупреждение: Соответствие блока «From» для блока «Goto» «dcbustctrl_igbt/VDC/Goto» не найдено.
Кроме того, нет выходных данных из блока Machines Maesurement Demux.
Принятый ответ
- blockUpdate.mdl
Эта ошибка исправлена в выпуске 14 (R14). Для предыдущих выпусков, пожалуйста, прочитайте ниже возможные обходные пути:
Казалось бы, проблема в том, что SimPowerSystems не компилируется для этой модели. Если вы посмотрите в командное окно после запуска моделирования, вы увидите, что там нет сообщения о компиляции SimPowerSystems. Дело в том, что в модели отсутствует измерительный блок. Блок демультиплексора не считается блоком измерения.
Пользователю библиотеки может быть неочевидно понимать такое поведение, поскольку в документации это ограничение не упоминается. В предыдущих версиях Power System Blockset Simulink обнаруживал отсутствие блоков измерения, и пользователю появлялось всплывающее предупреждение. Сейчас в SimPowerSystems эту функцию убрали.
Решение состоит в том, чтобы добавить в модель фиктивное измерение напряжения. Теперь SimPowerSystems должен скомпилироваться, и больше не должно быть предупреждений goto-from. Однако симуляция может не начаться из-за ошибки в модели моста GTO-IGBT.
Прилагается обновление для этой модели. Пожалуйста, откройте blockupdate.mdl и следуйте инструкциям по обновлению этой библиотеки. Затем запустите модифицированную модель.
Больше ответов (0)
Произошла ошибка
Не удалось выполнить действие из-за изменений, внесенных на страницу. Перезагрузите страницу, чтобы увидеть ее обновленное состояние.
Переведено
Выберите веб-сайт
Выберите веб-сайт, чтобы получить переведенный контент, где он доступен, и увидеть местные события и предложения.