Область действия имени. Описание имени
(константы, типа, переменной, процедуры, функции) распространяется на весь
блок, в котором содержится это описание. Область, в которой справедливое
описание имени, определяется областью действия этого имени.
Имя, которое описано в блоке основной
программы, называется глобальным. Имя, которое описано в блоке подпрограммы,
называется локальным. Имя является глобальным относительно блока, если оно
описано во внешнем (по отношению к заданному) блоку. Описание локального имени за
пределами «своего блока» не определено. Если во вложенном блоке описанное
локальное имя, что совпадает с глобальным, то областью действия этого
локального имени будет «свой блок», за его границами действует описание
глобального имени. Например, при выполнении программы
program ELR6;
var A,X,Y: real;
procedure D(var
X,Y:real);
begin
А:=2*X;{смена значение глобальной переменной A=2*2=4}
В:=A*X+1 {Y=4*2+1=9}
end;
begin
А:=2; X:=3; В:=2;
D(Y,X);
В:=A*Y+X; {Y=4*2+9=17}
Writeln(X,Y)
end.
получаем
результат: X= 9, Y= 17.
Побочным эффектом подпрограммы называют
изменение значения глобальной переменной всередине подпрограммы. Если такой
эффект не предусмотрен программистом специально, то он может стать источником ошибок, что достаточно трудно обнаружить.
В привелённом выше примере побочным эффектом процедуры является изменение
значения переменной А.
Если процедура или функция вызывает сама
себя, то она называется рекурсивной. Глубина рекурсии, то есть количество
вызовов, в системе Turbo Pascal не ограничивается. Реально она зависит от
ресурсов памяти конкретного компьютера.
В общем случае рекурсивность - это не
свойство самой процедуры или функции, а свойство ее описания. Рекурсивная
подпрограмма, как правило, короче и более наглядная, но при выполнении требует
больше времени и памяти за счет повторных обращений к самой себе и дублирование
локальных переменных. Необходимо хорошо понимать, что каждый дежурный
рекурсивный вызов приводит к образованию новой
копии локальных объектов подпрограммы и все эти копии, что отвечают цепные
активизированных и незавершенных рекурсивных
вызовов, существуют независимо один от другого.