Консультация № 108698
09.11.2007, 14:17
0.00 руб.
0 5 5
Здравствуйте, уважаемые эксперты.

Я студент, начал изучение языка Паскаль. На одной из первых лекций преподаватель сказал, что в программах "не рекомендуется" использовать оператор безусловного перехода GoTo. Однако ни он, никто из других преподавателей внятно не объяснил - почему. То же самое встречалось в некоторых книгах, и по другим языкам программирования. Может быть Вы свожете объяснить, в каких случаях этот оператор можно использовать, в каких - нет, и почему.

Заранее благодарен,
m3sergey.

Обсуждение

Неизвестный
09.11.2007, 14:50
общий
это ответ
Здравствуйте, M3sergey!
Сегодня все говорят о ООП. Это раз. Там и не предусмотрено никаких GOTO;
Во-вторых, любой код можно написать таким образом, чтобы не использовать оператор перехода.
В-третьих, и главное, в будущем, при отладке, особенно больших проектов, вы не раз ругнетесь, если будете использовать его. То бишь, он затрудняет чтение и отладку кода, что очень и очень важно в профессиональной работе программиста.
Неизвестный
09.11.2007, 15:42
общий
это ответ
Здравствуйте, M3sergey!
Нельзя сказать, что использование go to неприемлемо ни в каких случаях. Мне, честно говоря, он никогда необходим не был (в языках высокого уровня), но бывают ситуации, когда им можно воспользоваться, например, организовать экстренный выход из программы без функций типа halt. Но лучше всё-таки этого избегать:
1. Это сильно затрудняет понимание кода.
2. Безусловные переходы по программе могут привести к критическим ошибкам, исключениям (например, ошибки циклов, или недопустимые арифметические действия - не всегда просто предсказать, какие значения переменных или условий будут использоваться при таком переходе).
3. Это затрудняет отладку программ, поскольку следить за бесконечными метками и перемещениями к ним требует большего внимания и времени.
Главное, что можно сказать "внятно" - это то, что использованием go to программист сильно затруднит жизнь себе и коллегам, которые, возможно, будут использовать его код. Но если Вам всё же хочется его использовать в каком-то оправданном случае, то основное правило - никогда не производить переходов назад, это самое опасное действие.
Надеюсь, помогла.
Удачи!
Неизвестный
09.11.2007, 16:29
общий
это ответ
Здравствуйте, M3sergey!
Когда в программе слишком много операторов goto, то она станосится нечитабельной (переходы могду осуществляться как по ходу кода программы, так и наоборот, "вверх", и в этом тяжело разобраться), ее будет трудно отлаживать. Но иногда использование goto позволяет сделать программу более наглядной, и в ней гораздо труднее совершить ошибку.

Приложение:
Трюки от КрысаКрис КасперскиХакер, номер #102, стр. 120Совет 3: выход из нескольких циклов сразуНачинающие программисты постоянно задают мне один и тот же вопрос: как выйти из двух и более циклов сразу? Средствами структурного программирования никак не получается. То есть получается, конечно, но приходится использовать флаги, проверяемые в каждом цикле, что не только громоздко, ненадежно, ненаглядно, но еще и непроизводительно. Современные процессоры не любят ветвлений, и каждая лишняя проверка сжирает кучу тактов, особенно на нерегулярных переходах, которые невозможно предсказать.Выход состоит в использовании горячо критикуемого goto, который обвиняют в неструктурности и вообще в «идеологической неправильности». Действительно, при злоупотреблении goto программа превращается в спагетти и ее становится совершенно невозможно отлаживать, поскольку непонятно, как мы вообще попали в этот блок кода и какая зараза совершила сюда переход. Но сравни два следующих фрагмента кода:Выход из трех циклов с использованием оператора gotofor(…){for (…){for(…){if (…) goto to_exit;}}} to_exit:Выход из трех циклов без использования оператора gotoint to_exit = 0;for(…){for(…){for(…){if (…){to_exit = 1;break;}}if (to_exit) break;}if (to_exit) break;}Не кажется ли тебе, что этот код намного более нагляден и в нем гораздо труднее совершить ошибку, чем в «идеологически правильном» варианте? Увы! В некоторых случаях, использование goto строго запрещено принятыми корпоративными правилами кодирования, против которых не попрешь. Вот такая, значит, бюрократия.
давно
Старший Модератор
31795
6196
09.11.2007, 16:38
общий
это ответ
Здравствуйте, M3sergey!

Компиляторы структурных языков имеют встроенные механизмы оптимизации.
Использование оператора GoTo, отключает оптимизацию и машинный код генерируется как есть, программа получается ресурсоемкой (как по размеру исполняемого файла так и скорости выполнения).

Посмотрите <a href=http://ru.wikipedia.org/wiki/GOTO#.D0.9A.D1.80.D0.B8.D1.82.D0.B8.D0.BA.D0.B0>Доводы за и против</a> и упоминаемый в статье <a href=http://evrika.tsi.lv/index.php?name=texts&file=show&f=388>Эдсгер В. Дейкстра</a>, его мнение.

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
09.11.2007, 17:07
общий
это ответ
Здравствуйте, M3sergey!
Использовать то можно, только осторожно и только в исключительных ситуациях. А так четко продуманный алгоритм позволяет обойтись без оператора безусловного перехода вообще.
Форма ответа