Побочные эффекты
Если в теле процедуры (функции) используется некоторая нелокальная переменная, т.е. такая переменная, которая описана в основной части программы, то могут наблюдаться непредвиденные последствия.
Пример. Пусть функция f(x) имеет такой вид:
-
function f(x: real): real;
-
begin
-
v :=v * x;
-
f :=sqrt(v) + x
-
end;
т.е. в процессе работы функция f изменяет некоторую нелокальную величину v. Рассмотрим теперь два выражения, которые вычисляются в программе: f(x) + v и v + f(x).
Эти выражения дадут разные результаты, т.к. в первом случае к f(x) прибавляется уже измененное значение v (в процессе работы f), а во втором случае к первоначальному значению v добавляется f(x).
Вторая опасность заключается в неправильном использовании параметров-переменных в качестве формальных параметров.
Пример. Найти 5-й член последовательности
-
an + 1=3an – 2,
-
a1=1.
Опасно оформлять функцию в виде
-
function f(var a, n: integer): integer;
-
var i: integer;
-
begin
-
for i :=1 to n do
-
a :=3 * a – 2;
-
f :=a
-
end;
Так, если обратиться к этой функции оператором b :=f(1, 5), будет «испорчена» константа 1, т.к. в ячейку памяти (первый фактический параметр), содержавшую ранее единицу, функция f поместит текущий член последовательности, и при дальнейшей работе программы вместо 1 будет использоваться значение a5. Такие ошибки бывает трудно найти, поэтому полезно придерживаться следующего правила: в функциях не использовать параметры переменные.