【发布时间】: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