【问题标题】:procedural language understanding - static vs dynamic scoping程序语言理解 - 静态与动态范围
【发布时间】:2014-12-12 07:07:51
【问题描述】:

我无法理解我们收到的作业的答案。我相信我对“嵌套”函数的概念感到困惑,但也许这是错误的。我正在寻找一些关于从以下代码中分配动态和静态范围值的帮助。

x : integer -- global

procedure set_x(n : integer)
    x := n
end

procedure print_x
    write_integer(x)
end

procedure first
    set_x(1)
    print_x
end

procedure second
    x : integer
    set_x(2)
    print_x
end

// program starts here
set_x(0)
first()
print_x
second()
print_x

Static Scoping Output: 1122
Dynamic Scoping Output: 1121

我对每一个的想法:

静态:

  • 运行set_x(0),由于n的参数,这会产生一个局部变量,但是由于我们将x设置为n而没有在本地声明x(int x =..),因此我们将全局x更新为0。
  • 运行first(),它执行set_x(1),它遵循相同的逻辑将x 全局更新为1。然后我们在 first 中运行 print_x,它会打印出 1 的全局 x。
  • 运行print_x,它只是重新打印1。
  • 运行second(),我们在本地声明x 并运行set_x(2),它将2 更新为n。 (因为set,而不是second 过程,对吧?然后我们运行它的print_x 过程,它会打印2。
  • 运行 print_x 再次将 2 转出。
  • 导致 1122

动态(对这个比较困惑)

  • 运行 set_x(0) 将 x 和全局 x 设置为 0。
  • 运行 first() 我们再次点击 set_x 并将 x 更新为 1。我们打印 1。
  • 运行print_x我们重新打印1。
  • 运行 second() 我们在本地创建 x,我们运行 set_x(2),并将全局 x 设置为 2。然后我们打印 2。
  • 运行print_x 最后我们重新打印,这里是我猜的2,但答案应该是1。
  • 我猜是 1122,实际答案是 1121

我对动态的最后一部分以及为什么它是 1 而不是 2 感到困惑。

【问题讨论】:

    标签: scope scoping dynamic-scope


    【解决方案1】:

    在某些地方很难遵循您的推理,因为您没有说 哪个 x 您认为正在打印或更新,而这几乎就是整个蜡球。

    要记住的重要一点是,静态作用域(也称为词法作用域)在编译时完全确定。 定义的地方决定了它的静态范围。

    动态范围当然是相反的;它是在运行时确定的。 执行的位置决定了它的动态范围。

    所以,看看set_x 过程。它没有自己的本地x,它是在全局范围内定义的,因此在静态范围下,它只能更新全局x。无论在哪里调用都是如此,即使在second 过程中

    然而,在动态作用域下,second 中的 set_x 调用更新了 second 的本地 x,而保持全局 x 不变。

    请注意,无论范围规则如何,最后一次 print_x 调用将始终打印全局 x(因为 print_x 过程是在全局范围内定义的,并且对 print_x 的调用在全局范围)。所以区别在于静态作用域,全局x在程序结束时为2;但使用动态范围,全局 x 为 1。

    【讨论】:

    • 所以动态作用域有 2 的原因是因为它是在那个时间点打印的局部变量,而不是全局变量 x? (因为局部 x 在第二个中定义)。如果这是真的,在 set_x 方法中这个 x 是否仍然设置为 2,但是由于 set_x 是从第二个调用的,它仍然设置本地 x 而不是第二个而不是全局?
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 2011-05-20
    • 1970-01-01
    • 2020-02-19
    • 2012-09-17
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多