Если в теле процедуры (функции) используется некоторая нелокальная переменная, т.е. такая переменная, которая описана в основной части программы, то могут наблюдаться непредвиденные последствия.
Пример. Пусть функция 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. Такие ошибки бывает трудно найти, поэтому полезно придерживаться следующего правила: в функциях не использовать параметры переменные.