在处理静态范围和动态范围时我感到困惑,对于这个伪代码,我必须找到它们。对于两者我相信它应该打印出来:9 4 2 3然而,我并不完全确定。任何帮助将不胜感激,谢谢。
g: integer
procedure B(a: integer)
x: integer
x := a X a
R(1)
procedure A(n: integer)
g := n
procedure R(m: integer)
write_integer(x)
x /:= 2 -- integer division
if x > 1
R(m + 1)
else
A(m)
procedure main() -- entry point
B(3)
write_integer(g)
答案 0 :(得分:1)
如果您的语言是静态范围的,那么变量x
仅对函数B
是本地的,并且在B
之外不可见。
但是,您的语言是动态范围的:第一次控制流经过x: integer
行时,变量x
现在可全局访问。
所以,这是事件的顺序:
B(3)
指定x := 9
R(1)
撰写9
并指定x = 4
并致电R(2)
R(2)
撰写4
并指定x = 2
并致电R(3)
R(3)
撰写2
和assignx x = 1
并致电A(3)
A(3)
指定g = 3
write_integer(g)
打印3
。