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

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

Пример. Пусть функция 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-й член последовательности

a<sub>n + 1</sub> = 3a<sub>n</sub> – 2,
a<sub>1</sub> = 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. Такие ошибки бывает трудно найти, поэтому полезно придерживаться следующего правила: в функциях не использовать параметры переменные.

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
CAPTCHA на основе изображений
Введите символы, которые показаны на картинке.