program R;
var a,i:real;
procedure P1;
var b :real;
procedure P2;
var x,i :real;
begin
i:=2
begin
end{P2};
i:=99;P2;
writeln (i) {99}
end{P1};
function F :real;
var z :real;
begin
i:=0; F:=i
end{F};
begin
P1;
writeln (i);{99}
writeln (i+F); {99+0=0(?)}
writeln (F+i); {0+0=0}
end {R}.
В приведенном выше примере побочный эффект выражается в том , что нарушается одно из правил сложения «при перемени мест слагаемых сумма не меняется» : i+F=99, но F+i =0.
Рассмотрим причины возникновения такой ситуации и познакомимся с одной из парадоксов версии Турбо –Паскаля.
Проведем анализ алгоритма главной программы R.
При обращении к процедуре Р1 переменная I принимает значения 99.
Причем при обращении к внутренней процедуре Р2 (имеющей локальную переменную i) значение I не меняется , согласно сформулированным правилам локализации.
Функция F всегда возвращает значение , равное нулю и i=0.
Поэтому, так как в первом случае переменная i является первым слагаемым, то : i+F=99.
Во втором арифметическом выражении вначале происходит обращение к функции F, после которого результат функции и переменная i равны нулю, поэтому и сумма их равна нулю: F+i =0.
но при использовании версии Турбо-Паскаль , результат в обоих случаях, вопреки всем правилам , будет равен нулю. Например, если сделать предположение, что все дело в приоритете операций ( выполнение арифметического выражения всегда начинается с вычисления функций), то эксперименты в этом направлении ничего не изменят : тот же нулевой результат.
Вопрос = Почему в турбо паскале проявляется этот побочный эффект?