我无法理解我们回来的作业的答案。我相信我对“嵌套”函数的概念感到困惑,但也许这是错误的。我正在寻找一些关于从以下代码中分配动态和静态范围值的帮助。
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
当我经历每一个时,我的想法:
静止的:
- Run
set_x(0)
,由于 n 的参数,这会产生一个局部变量,但是由于我们将 x 设置为 n 而没有在本地声明 x (int x =..),因此我们将全局 x 更新为 0。 - Run
first()
,它执行set_x(1)
,它遵循相同的逻辑将 x 全局更新为 1。然后我们首先在其中运行print_x
,它打印出 1 的全局 x。 - Run
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 感到困惑。