Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2- Введение в программирование.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
753 Кб
Скачать
☆

Оператор безусловного перехода

Оператор goto, который имеется во многих алгоритмических языках, в свое время был подвергнут гонениям, как противоречащий принципам структурного программирования. Ибо было доказано, что можно вообще программировать без него. Однако хотя язык Pascal является классическим языком структурного программирования, в нем тем не менее существует этот оператор. Т.е. выбор между чистотой идеи (структурное программирование) и элементарным удобством (использование goto в отдельных случаях) был сделан в пользу последнего. Полный синтаксис оператора безусловного перехода:

goto <метка>;

где метка - описанный в блоке Label идентификатор (может начинаться с цифры). Метка может стоять в программе в любом месте между операторами и отделяется от второго оператора двоеточием ":". Каждая метка может появляться только один раз.

Label

L1, L2;

Begin

…

goto L1;

…

L1 : goto L2;

…

L2 :

End.

В примере программа, дойдя до goto L1, сразу заканчивается. Можно ставить метки перед словом end, хотя это не оператор (перед begin нельзя). Следует избегать переходов внутрь составных операторов, вложенных в тот, где выполняется оператор goto (особенно если это составные операторы цикла). Наиболее распространены случаи использования goto при выходе из вложенных операторов во внешние, в частности для преждевременного выхода из операторов цикла.

Область действия операторов безусловного перехода строго локализована. Метки, описанные в основном блоке, действуют только в нем, и не распространяются на процедуры и функции. Запрещены переходы по оператору goto между процедурами, а также между процедурами и основным блоком.

Есть два оператора, похожих на goto, предназначенные для выхода из программных блоков (процедур, функций, основного программного блока). Это бывает удобно, т.к. позволяет завершить программу или процедуру без предварительного перехода к меткам.

К таким операторам завершения относятся вызовы системных процедур Exit и Halt. Вызов Exit завершает работу своего программного блока. Т.е. если Exit выполняется в процедуре, то ее выполнение завершится и ход программы вернется к следующему за вызовом этой процедуры оператору. При этом процедура вернет значения, которые успели вычислиться к моменту выполнения Exit (если она должна их возвратить). Сама программа не прервется. Но если Exit выполняется в основном блоке, выход из нее будет эквивалентен нормальному ее завершению. В принципе, процедура Exit избыточна, т.к. эквивалентна оператору goto на метку, стоящую перед последним словом end. Но ее использование позволяет избежать лишней возни с метками и улучшает читаемость программы. Процедура Halt (более полно Halt(n)) действует менее разборчиво. Независимо от того, где она находится, ее выполнение завершает работу программы с кодом завершения n. Этот код впоследствии может быть проанализирован в среде MS-DOS. Имеет смысл при нескольких вызовах Halt в тексте программы назначить им разные коды завершения. Тогда можно будет при отладке или работе определить, чем вызвано прерывание программы.