第七章作业
练习7.2.5:在一个通过引用传递参数的语言中,有一个函数f(x,y)完成下面的计算:x=x+1;y=y+2;return x+y;
如果将a赋值为3,然后调用f(a,a),那么返回值是什么?
解:执行语句x=x+1,则a=a+1=4,
再执行语句y=y+2,则a=a+2=5,
最后返回x+y,则返回a+a=9。
练习7.2.6:C语言函数f的定义如下:
int f(int x,*py,**ppz) {
**ppz+=1;*py+=2;x+=3;return x+*py+**ppz;
}
变量a是一个指向b的指针;变量b是一个指向c的指针,而c是一个当前值为4的整数变量。
如果我们调用f(c,b,a),返回值是什么?
解:先执行语句**ppz+=1,则c=*b=**a=5,
再执行语句*py+=2,则*b=*b+2=7,c=*b=**a=7,
接着执行语句x+=3,则x=4,x=x+3=7,而c=*b=**a=7,
最后执行语句return x+*py+**ppz,则返回7+7+7=21。
练习7.3.2:假使我们使用显示表来实现下图中的函数。
请给出对fib0(1)的第一次调用即将返回时的显示表。
同时指明那时在栈中的各个活动记录中保存的显示表条目。
计算Fibonacci数的嵌套函数
解:
第八章练习
练习8.2.1:假设所有的变量都存放在内存中,为下面的三地址语句生成代码: 5)两个语句的序列 x=b*c y=a+x
解:生成的代码如下: LD R1, b LD R2, c
MUL R1, R1, R2 ST x, R1 LD R2, a
ADD R1, R2, R1 ST y, R1
练习8.2.6:确定下列指令序列的代价。
1)LD R0,y LD R1,z ADD R0,R0,R1 ST x,R0 解:2+2+1+2=7 2)LD R0,i MUL R0,R0,8 LD R1,a(R0) ST b,R1
main()
fib0(4) 保存的d[2] fib1(4) 保存的d[3] fib2(4) 保存的d[4] fib1(3) 保存的d[3] fib0(2) 保存的d[2] fib1(2) 保存的d[3] fib0(1) 保存的d[2]
d[1] d[2] d[3] d[4]
解:2+2+2+2=8
3)LD R0,c
LD R1,i
MUL R1,R1,8 ST a(R1),R0 解:2+2+2+2=8
4)LD R0,p
LD R1,0(R0) ST x,R1 解:2+2+2=6
5)LD R0,p
LD R1,x
ST 0(R0),R1 解:2+2+2=6
6)LD R0,x
LD R1,y SUB R0,R0,R1 BLTZ *R3,R0 解:2+2+1+1=6。