Оператор безусловного перехода goto
Оператор безусловного перехода gotoимеет следующую форму:
gotoметка
Он переносит выполнение программы к оператору, помеченному меткой метка.
Метка представляет собой идентификатор или целое без знака. Чтобы пометить оператор меткой, необходимо перед оператором указать метку с последующим двоеточием:
label1: оператор
Метки должны быть описаны в разделе меток с использованием служебного слова label:
label1,2,3;
Например, в результате выполнения программы
label1,2;
begin
vari := 5;
2: ifi<0 then goto1;
write(i);
Dec(i);
goto2;
1:
end.
будет выведено 543210.
Метка должна помечать оператор в том же блоке, в котором описана. Метка не может помечать несколько операторов.
Переход на метку может осуществляться либо на оператор в том же блоке, либо на оператор в объемлющей конструкции. Так, запрещается извне цикла переходить на метку внутри цикла.
Использование оператора безусловного перехода в программе считается признаком плохого стиля программирования. Для основных вариантов использования gotoв язык Паскаль введены специальные процедуры: break- переход на оператор, следующий за циклом, exit- переход за последний оператор процедуры, continue- переход за последний оператор в теле цикла.
Один из немногих примеров уместного использования оператора gotoв программе - выход из нескольких вложенных циклов одновременно. Например, при поиске элемента k в двумерном массиве:
vara: array[1..10,1..10] ofinteger;
...
varfound := False;
for vari:=1 to10 do
for varj:=1 to10 do
ifa[i,j]=k then
begin
found := True;
gotoc1;
end;
c1: writeln(found);
Операторы break, continue и exit
Операторы breakи continueиспользуются только внутри циклов.
Оператор breakпредназначен для досрочного завершения цикла. При его выполнении происходит немедленный выход из текущего цикла и переход к выполнению оператора, следующего за циклом. Оператор continueзавершает текущую итерацию цикла, осуществляя переход к концу тела цикла. Например:
flag := False;
for vari:=1 to10 do
begin
read(x);
ifx<0 then continue; // пропуск текущей итерации цикла
ifx=5 then
begin
flag := True;
break; // выход из цикла
end;
end;
Использование операторов breakи continueвне тела цикла ошибочно.
Оператор exitпредназначен для досрочного завершения процедуры или функции. Например
functionAnalyze(x: integer): boolean;
begin
ifx<0 then
begin
Result := False;
exit
end;
...
end;
Вызов exitв разделе операторов основной программы приводит к ее немедленному завершению.
Следует отметить, что в PascalABC.NET(в отличие от Borland Pascal и Borland Delphi) break, continueи exitявляются не процедурами, а именно операторами.
Оператор try... exceptимеет вид:
try
операторы
except
блок обработки исключений
end;
Блок tryназывается защищаемым блоком . Если при выполнении программы в нем происходит ошибка, то он завершается и выполнение передается блоку except. Если исключение обрабатывается в блоке except, то после его обработки программа продолжает выполняться с оператора, следующего за try... except... end. Если исключение остается необработанным и имеется объемлющий блок try, то выполнение передается его блоку except. Если объемлющего блока tryнет, то программа завершается с ошибкой. Наконец, если в блоке tryошибки не произошло, то блок exceptигнорируется и выполнение программы продолжается дальше.
Если в процессе обработки исключения (в блоке except) произошло другое исключение, то текущий блок exceptзавершается, первое исключение считается необработанным и обработка нового исключения передается объемлющему блоку try. Таким образом, в каждый момент времени существует максимум одно необработанное исключение.
Читать дальше