【问题标题】:Static and dynamic scoping静态和动态范围
【发布时间】:2011-03-06 19:20:03
【问题描述】:

我总是对静态和动态范围感到困惑,因此需要有人检查我的评估。以下是示例代码:

int x = 1;

procedure P(i) {
int x = 1;
i++;
Q(i);
}

procedure Q(j) {
j = j + x;
}


P(x)
print x

在静态作用域中,我们总是查看函数/过程的位置以了解其作用域。因此,

1 main 是程序的最外层范围
2 > 过程PQ 在main 中,因此如果未在其本地范围内定义,它们应始终引用main 函数中的变量。这与过程调用的方式无关
3 > 在示例中,过程P 定义了变量x。因此它会影响main's x
4 > 过程Q 没有定义变量x,因此应引用main's x

输出是
1 > 对于静态范围和值传递=> 1
2 > 动态作用域和值传递=> 2

3 > 用于静态范围和通过引用传递=> 4
4 > 对于动态范围和通过引用传递=> 3

如果我在某个地方出错了,请告诉我。此外,如果有人可以为我提供有关上述静态和动态范围示例的有用链接,那就太好了。

谢谢,
小黑子

【问题讨论】:

  • 这是一种特定的语言还是与语言无关?请适当标记。

标签: language-agnostic scope


【解决方案1】:

a number of articles out there。 Google 是你的朋友 :-)

[编辑]在阅读了其中的一些链接后,我认为以下是正确的:

  1. 对于静态范围和按值传递=> 1
  2. 用于动态范围和按值传递=> 1
  3. 对于静态范围和通过引用传递=> 4
  4. 对于动态范围和通过引用传递=> 3

第 2 点应返回 1,因为您是按值传递的,因此您传入的 x 永远不会被修改。

Tim Hoolihan 有an example which is easier to follow

【讨论】:

  • 主要问题:您能评价一下我的理解吗? :)
  • 知道了。谢谢指正!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多