4
program PP(input, output)
VAR k:integer;
FUNCTION F(n:integer): interger
begin
if n <= 0 then F := 1
else F := n * F(n-1);
end;
begin
K := F(10);
...
end
第二次递归进入F后,DISPLAY内容是什么?运行栈内容是什么?
Display内容
0 |
---|
11 |
运行栈
函数 | 位置 | 数据 |
---|---|---|
main | 0 | 0 |
main | 1 | 返回地址 |
main | 2 | 0(display) |
main | 3 | K |
F(10) | 4 | 0(SP) |
F(10) | 5 | 返回地址 |
F(10) | 6 | 2(全局display) |
F(10) | 7 | 1(形参个数) |
F(10) | 8 | n(形参) |
F(10) | 9 | 0(display) |
F(10) | 10 | 4(display) |
F(9) | 11 | 4 |
F(9) | 12 | 返回地址 |
F(9) | 13 | 9(全局display) |
F(9) | 14 | 1(形参个数) |
F(9) | 15 | n(形参) |
F(9) | 16 | 0(display) |
F(9) | 17 | 11(display) |
5
对如下程序,画出运行到1和2的运行栈
program Tr(input, output);;
VAR i:integer; d:integer;
procedure A(k:real);
VAR p:char;
procedure B;
VAR c:char;
Begin
...(1)
end;{B}
procedure C;
VAR t:real;
Begin
...(2)
end;{C}
Begin
...
B;
C;
...
end;{A}
Begin{main}
...
A(d);
...
end.
(1)
位置 | 数据 |
---|---|
0 | 0 |
1 | 返回地址 |
2 | 0 |
3 | i |
4 | d |
5 | 0(动态链指向0) |
6 | 返回地址 |
7 | 0(静态链接指向0) |
8 | 1(形参个数) |
9 | k(形参) |
10 | p |
11 | 5(SP,同时也是动态连接) |
12 | 返回地址 |
13 | 5(静态链接指向5) |
14 | 0(参数个数) |
15 | c(TOP) |
(2)
位置 | 数据 |
---|---|
0 | 0 |
1 | 返回地址 |
2 | 0 |
3 | i |
4 | d |
5 | 0(动态链指向0) |
6 | 返回地址 |
7 | 0(静态链接指向0) |
8 | 1(形参个数) |
9 | k(形参) |
10 | p |
11 | 5(SP,同时也是动态连接) |
12 | 返回地址 |
13 | 5(静态链接指向5) |
14 | 0(参数个数) |
15 | t(TOP) |
6
program main;
VAR a, b, c: integer
procedure X(i, j: integer);
VAR d, e: real;
procedure Y;
VAR, f, g: real;
Begin
...
End;{Y}
procedure Z(k: integer);
VAR h, I, j: real;
Begin
...
end;{Z}
Begin
...
10: Y;
...
11: Z;
...
end;{X}
begin
...
X(a, b);
...
end.{main}
给出以下运行栈和display内容
(1)开始而未执行标号10的语句
display
display |
---|
0 |
6 |
16 |
stack内容
位置 | 数据 |
---|---|
0 | 0 |
1 | 返回地址 |
2 | 0 |
3 | a |
4 | b |
5 | c |
6 | 0(指向0) |
7 | 返回地址 |
8 | 2(全局display) |
9 | 2(形参个数) |
10 | i |
11 | j |
12 | 0(display) |
13 | 6(display) |
14 | d |
15 | e |
16 | 6(指向6) |
17 | 返回地址 |
18 | 12(全局display) |
19 | 0(形参个数) |
20 | 0(display) |
21 | 6(display) |
22 | 16(display) |
23 | f |
24 | g |
(2)开始而未执行标号11的语句
display |
---|
0 |
6 |
16 |
stack
位置 | 数据 |
---|---|
0 | 0 |
1 | 返回地址 |
2 | 0 |
3 | a |
4 | b |
5 | c |
6 | 0(指向0) |
7 | 返回地址 |
8 | 2(全局display) |
9 | 2(形参个数) |
10 | i |
11 | j |
12 | 0(display) |
13 | 6(display) |
14 | d |
15 | e |
16 | 6(指向6) |
17 | 返回地址 |
18 | 12(全局display) |
19 | 1(形参个数) |
20 | k |
21 | 0(display) |
22 | 6(display) |
23 | 16(display) |
24 | h |
25 | I |
26 | j |
9
procedure P(X, Y, Z);
begin
Y := Y + 1;
Z := Z + X;
end P;
begin
A := 2;
B := 3;
p(A + B, A, A);
print A
end
求以下参数传递方法情况,输出的A
(1) 名字
A := 2
B := 3
A := A + 1
A := A + (A + B)
所以A == 9
(2) 地址
A := 2
B := 3
T := A + B
T,A,A的地址传入J1,J2,J3
x := J1
y := J2
z := J3
y = y + 1 (这时候相当于A+=1 变为3)
z = z + x (A = A+T)
所以 A == 8
(3) 得结果
A := 2
B := 3
T := A + B
T,A,A的地址传入J1,J2,J3
x1 := J1
y1 := J2
z1 := J3
x2 := T
y2 := A
z2 := A
(y2 = 3, z2 = 7)
y2 := y2 + 1
z2 := z2 + x2
x1 := x2
y1 := y2
z1 := z2
所以A == 7
(4)传值
A := 2
B := 3
x:=A+B
y:=A
z:=A
y:=y+1
z:=z+x
A==2(A不受影响)