top of page

Побочные эффекты

Если в теле процедуры (функции) используется некоторая нелокальная переменная, т.е. такая переменная, которая описана в основной части программы, то могут наблюдаться непредвиденные последствия.

Пример. Пусть функция f(x) имеет такой вид:

 

  1. function f(x: real): real;

  2.     begin

  3.         v :=v * x;

  4.         f :=sqrt(v) + x

  5.     end;

 

т.е. в процессе работы функция f изменяет некоторую нелокальную величину v. Рассмотрим теперь два выражения, которые вычисляются в программе: f(x) + v и v + f(x).

 

Эти выражения дадут разные результаты, т.к. в первом случае к f(x) прибавляется уже измененное значение v (в процессе работы f), а во втором случае к первоначальному значению v добавляется f(x).

 

Вторая опасность заключается в неправильном использовании параметров-переменных в качестве формальных параметров.

 

Пример. Найти 5-й член последовательности

 

  1. an + 1=3an – 2,

  2. a1=1.

 

Опасно оформлять функцию в виде

 

  1. function f(var a, n: integer): integer;

  2.     var i: integer;

  3.     begin

  4.         for i :=1 to n do

  5.             a :=3 * a – 2;

  6.         f :=a

  7.     end;

 

Так, если обратиться к этой функции оператором b :=f(1, 5), будет «испорчена» константа 1, т.к. в ячейку памяти (первый фактический параметр), содержавшую ранее единицу, функция f поместит текущий член последовательности, и при дальнейшей работе программы вместо 1 будет использоваться значение a5. Такие ошибки бывает трудно найти, поэтому полезно придерживаться следующего правила: в функциях не использовать параметры переменные.

bottom of page