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