program TEST;
var
A, B : real;
procedure ECHANGE (X, Y : REAL);
var
T : real;
begin
T := X;
X := Y;
Y := T;
Writeln(X,Y);
end;
begin
readln (A, B);
ECHANGE (A, B);
writeln (A, B);
end.
Cette solution est mauvaise. En effet, une simulation de son exécution donnera :
A = 5 B = 7 { saisie }
X = 7 Y = 5
A = 5 B = 7 {A et B restent inchangés !}
program Effet-de_bord;
var
i,j : integer;
function double (i : integer) : integer;
begin
double := 2 * i;
end;
function plus_un (j : integer) : integer;
var
i: integer;
begin
i := 10;
plus_un := j + 1;
end;
function moins_un (j : integer) : integer;
begin
i := 10;
moins_un := j - 1;
end;
begin { programme principal }
i := 0; j := 0; {i=0 ; j=0}
j := plus_un(i); {i=0 ; j=1}
j := double(j);{i=0 ; j=2}
j := moins_un(j);{i=10 ; j=1}
end.
La variable i a été modifiée dans la procédure, alors que l'on s'attendait à des modifications sur j. On appelle cela un effet de bord.
Un tel phénomène peut être très gênant (difficulté à retrouver les erreurs).