本练习中静态和动态范围之间的区别是什么?

时间:2012-03-05 03:15:11

标签: pseudocode scoping

在处理静态范围和动态范围时我感到困惑,对于这个伪代码,我必须找到它们。对于两者我相信它应该打印出来: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)

1 个答案:

答案 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