0

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

1 回答 1

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和分配x = 1和调用A(3)

  • A(3)分配g = 3

  • write_integer(g)打印3

于 2012-09-05T14:23:20.557 回答