
214 Гл. 3. Машинно-ориентированные алгоритмические языки
многозначность конструкций типа
if х Ф О
then
if x > 0
then
х := 1
else
x:= — 1.
В паскале эта многозначность искусственно разрешается при-
нятием
соглашения, что такого рода конструкцию
следует
пони-
мать как сокращение для
if хФО
then
begin
if x > О
then
x := 1
else
x := —
1
end.
Повторение
последовательного разбора случаев, получив-
шееся у нас в примере гот из
3.3.5.2,
можно заменить более
эффективным
последовательным разбором случаев, каждый из
которых представляет собой повторение (оператор цикла). При
этом те из появляющихся операторов цикла, которые повторяют
своё тело не более одного раза, можно преобразовать в вырож-
денный
разбор случаев. См. рис. ПО.
3.4.
Операторы
перехода
3.4.1.
Гладкие
вызовы
и
операторы
перехода
В разделах
3.3.2.1
и 3.3.5 было показано, как из прямых
повторительных подпрограмм получить итеративные формули-
ровки,
записанные с помощью операторов цикла. Теперь мы
рассмотрим более общий метод, применяемый, в частности, к
•системам повторительных подпрограмм. Прежде всего пере-
формулируем систему
(ispos,
isneg)
из
2.4.1.4.
Если „снаружи"
важна лишь подпрограмма
ispos,
то мы можем подчинить ей
подпрограмму
isneg
(см.
2.5.1)
или, лучше (для сохранения
•симметрии),
пару подпрограмм (isp, isn)—см. рис. 111.
Если
проследить работу машины обработки формуляров для
этой
повторительной системы после начального вызова isp(m),
то можно обнаружить, что в
ходе
вычислений мы скачем
туда-
сюда
между
подпрограммами isp и isn. В соответствии с нашим
прежним
образом действий введём переменную
pvar
вместо па-
раметра р подпрограммы isp переменную
nvar
вместо парамет-
ра п подпрограммы isn. Тогда
гладкий
вызов (см.
2.3.3)
подпро-
граммы isp (соотв. isn) можно заменить присваиванием новых
значений
параметров переменной
pvar
(соотв.
nvar)
с последую-
щим
продолжением исполнения тела вызванной подпрограммы
(впрочем, переменные
pvar
и
nvar
здесь можно было бы и отож-
дествить).
Чтобы выразить это, нам понадобится новый языковый эле-
мент, называемый
оператором
перехода
'•
2
:
goto
>метка<,
1
В оригинале Sprung (прыжок, скачок). —
Прим.
перев.
2
Ниже goto — слитно написанное go to (иди к). —
Прим.
перев.