Оператор безусловного перехода goto
Оператор безусловного переходаgoto
имеет следующую форму:
goto
метка
Он переносит выполнение программы к оператору, помеченному меткой
метка
.
Метка представляет собой идентификатор или целое без знака. Чтобы пометить оператор меткой, необходимо перед оператором указать метку с последующим двоеточием:
label1:
оператор
Метки должны быть описаны в разделе меток с использованием служебного слова
label
:
label 1,2,3;
Например, в результате выполнения программы
label 1,2;
begin
var i := 5;
2: if i<0 then goto 1;
write(i);
Dec(i);
goto 2;
1:
end.
будет выведено 543210
.
Метка должна помечать оператор в том же блоке, в котором описана. Метка не может помечать несколько операторов.
Переход на метку может осуществляться либо на оператор в том же блоке, либо на оператор в объемлющей конструкции. Так, запрещается извне цикла переходить на метку внутри цикла.
Использование оператора безусловного перехода в программе считается признаком
плохого стиля программирования. Для основных вариантов использования
goto
в язык Паскаль введены специальные
процедуры: break
- переход на оператор, следующий за циклом, exit
- переход за последний оператор процедуры,
continue
- переход за последний оператор в теле цикла.
Один из немногих примеров уместного использования оператора goto
в программе - выход из нескольких вложенных циклов одновременно.
Например, при поиске элемента k
в
двумерном массиве:
var a: array [1..10,1..10] of integer;
...
var found := False;
for var i:=1 to 10 do
for var j:=1 to 10 do
if a[i,j]=k then
begin
found := True;
goto c1;
end;
c1: writeln(found);