Операторы goto, break, continue и прекращения программы
Оператор безусловного перехода goto
Паскаль является структурным языком программирования. Не смотря на это, в нем присутствует ряд особенностей, которые широко использовались на начальных этапах развития программирования. В те времена идея о том, что программа может рассматриваться как система логически связанных блоков, еще не оформилась. Поэтому, если требовалось изменить линейный ход программы, программисты использовали оператор безусловного перехода goto.
Позже большинство программистов отказались от регулярного использования оператора goto
, однако бывают случаи, когда он может быть полезен.
Необходимо знать, что всегда можно обойтись без оператора goto
. Его использование затрудняет чтение и понимание программы.
Оператор goto
осуществляет переход к оператору, помеченному специальной меткой, которая отделяется от самого оператора двоеточием. В качестве метки может быть использовано любое целое число без знака, содержащее более четырех цифр или любое имя. Чтобы можно было использовать метку, она должна быть в обязательном порядке объявлена в разделе меток в описательной части программы. Этот раздел начинается служебным словом label, после которого через запятую перечисляются метки.
Чтобы перейти к помеченному оператору, используется оператор перехода, имеющий следующий вид: goto метка;
label goback;
var num: real;
begin
goback:
write('Введите число: ');
readln(num);
if num < 0 then
goto goback;
num := sqrt(num);
writeln('Квадратный корень: ', num:5:2);
end.
Операторы break и continue
Бывает, что цель выполнения цикла достигается раньше, чем он будет прекращен по условию выхода. Так, например, в программе для определения простоты числа цикл будет выполняться n div 2-1
раз, хотя то, что число не является простым, может быть обнаружено на первых шагах цикла. Чтобы уменьшить количество шагов цикла, можно воспользоваться оператором goto, либо сформировать сложное условие выполнения (прекращения) цикла.
Однако существуют специальные операторы, использующиеся для прерывания хода выполнения цикла. Оператор break выполняет полный выход из цикла, т.е. все возможные итерации цикла прерываются. Оператор continue прерывает только текущую итерацию. Break
и continue
являются процедурами, хотя обычно их называют операторами.
Операторы break
и continue
выполняются в любом из видов циклов (repeat
, while
, for
) и действительны только для внутреннего цикла. Например, если нужно обеспечить принудительный выход из двойного цикла, оператор break
должен быть расположен как во внутреннем, так и во внешнем цикле. Операторы break
и continue
по сути являются видоизмененными операторами goto
с известной точкой, в которую осуществляется переход.
В примере у пользователя пять раз запрашивается число только в том случае, если он не вводит ноль.
var
num: real;
i: integer;
begin
for i := 1 to 5 do begin
write('Введите число: ');
readln(num);
if num = 0 then
break;
writeln(num)
end;
end.
В примере запрашиваются пять чисел и суммируются только положительные из них.
var
num, sum: real;
i: integer;
begin
sum := 0;
for i := 1 to 5 do begin
write('Введите число: ');
readln(num);
if num < 0 then
continue;
sum := sum + num
end;
write(sum:10:2);
end.
Принудительное прекращение программы
Обычно программа завершает свою работу по достижении последнего оператора (т.е. при выходе на оператор end
с точкой). Если возникает необходимость прекратить выполнение программы где-либо внутри нее, то можно воспользоваться процедурой halt, которая вызывается как отдельный оператор. Эту процедуру можно вызвать, задав в круглых скобках параметр в виде целого неотрицательного числа от 0 до 255. Это значение возвращается в операционную систему в виде кода ошибки (ERRORLEVEL
) и может быть проанализирована операционной системой. Отсутствие параметра в процедуре halt
соответствует значению 0 (нормальное завершение программы).
Второй процедурой, с помощью которой можно прекратить выполнение программы, является процедура без параметров exit при ее размещении в исполнимой части программы (а не в теле подпрограммы). Чаще эта процедура применяется для выхода из подпрограммы без прекращения выполнения вызывающей программы.