begin
integer i, j;
integer array A[1:3];
procedure P(x,y); integer x, y;
begin
y := 2;
Print(x);
i := 3;
Print(x);
Print(y);
end
A[1] := 7;
A[2] := 11;
A[3] := 13;
i := 1;
P(A[i], i);
P(i, A[i])
end
The question has four parts:
x and y are both passed by value. (This would require
adding the declaration value x, y; at the start of procedure P.)
The program prints 7, 7, 2, 3, 3, 2.
x is passed by value and y is passed by name. (This would require
adding the declaration value x; at the start of procedure P.)
The program prints 7, 7, 3, 3, 3, 2. Also, at exit, A[3] has been
changed to 2. The third number printed changes from 2 to 3 because the
by-name binding of y to i means that the assignment i := 3
changes y to 3. The value of A[3] is changed by the assignment
y := 2 on the second execution of P because y is bound by name
to A[i].
x is passed by name and y is passed by value. (This would require
adding the declaration value y; at the start of procedure P.)
The program prints 7, 13, 2, 3, 3, 2. The variables in the main program
are not changed. The reason 13 (the second number) is printed is that
the assignment i := 3 effects x, since it is bound by name to
A[i]. Therefore the second Print(x) prints A[3].
x and y are both passed by name, as written.
The program prints 11, 13, 3, 3, 3, 2.
Also, at exit, A[3] has been
changed to 2.
The reason 11 is printed the first time is that the assignment
y := 2 actually changes i to 2. Then the following
reference to x, which is A[i] by name, prints A[2], which
contains 11.
|
|
|
|