无主之地2dlc播单解说:几道编译原理的题目!急!!!!

来源:百度文库 编辑:高考问答 时间:2024/04/27 14:40:13
有下面Pascal程序段:
1.Program ret(input,output)
2.var f:function(integer):integer
3:function a:function(integer):integer
4.var m:integer
5.function addm(n:integer):integer
6.begin return m+n end;
7.begin m=0;return addm end
8.procedure b(g:function(integer):integer)
9.begin writeln(g(z)) end;
10.begin
11.f:=a;b(f);
12.end
假定非局部名字使用静态作用域,为什么程序在栈式分配情况下不能正确工作?
为什么C语言允许函数类型作为函数的返回类型,而Pascal却不允许?
下面程序在Sun工作站上运行时陷入死循环,试说明原因,如果将long *p改成short *p,将long k改成short k,loop的循环体执行一次便停止了,试说明原因.
main()
{addr();
loop();}
long *p;
loop()
{long i,j;j=0;
for(i=0;i<10;i++)
{(*p)--;j++;}
}
addr()
{long k;k=0;
p=&k;}

第一题不会。
第二题:执行addr()时,p被指向一个动态变量,该变量在退出addr()后被销毁,但p仍指向该内存区域。再执行loop时,声明的第一个变量i正好会使用该内存区域,所以p实际上就指向了i,因此for循环时*p--使得i减1,i++使得i加1,因此死循环。
如果把long改成short,则进入loop时,p指向的是i的高16位,(*p)--后,i的高16位变成全1,执行一次循环体后,i++,则i实际上变成了11111111 11111111 00000000 00000001,这个数大于10,因此循环结束。