【问题标题】:Lexical scoping vs dynamic scoping词法作用域与动态作用域
【发布时间】:2013-11-03 16:08:13
【问题描述】:

所以我遇到了这个问题,我必须使用两个不同的范围规则来计算输出。我知道使用词法作用域的输出是 a=3b=1,但我很难使用动态作用域来计算输出。
注意:下面的代码示例使用 C 语法,但我们只是将其视为伪代码。

int a,b;

int p() {
    int a, p;
    a = 0; b = 1; p = 2;
    return p;
}

void print() {
    printf("%d\n%d\n",a,b);
}

void q () {
    int b;
    a = 3; b = 4;
    print();
}

main() {
    a = p();
    q();
}

这是我想出的。 使用动态范围,对ab 的非本地引用可以更改。所以我有a=2(从 p() 返回),然后是b=4(在 q() 内)。 所以输出是2 4?

【问题讨论】:

  • 我认为您应该避免使用与函数同名的变量 (p)。
  • 您如何想象 C 代码的动态作用域?

标签: scope lexical-scope dynamic-scope


【解决方案1】:

我们知道,C 没有动态作用域,但假设它有,程序会打印 3 4。

在 main 中,a 和 b 是全局的。 a 将被设置为 2,因为我们将看到这是 p 将返回的值。

在 p 中,从 main 调用,b 仍然是全局的,但 a 是 p 中的局部。本地 a 设置为 0,但很快就会消失。全局 b 设置为 1。本地 p 设置为 2,将返回 2。现在全局 b 为 1。

在从 main 调用的 q 中,a 是全局的,但 b 是 q 中的局部。这里全局a设置为3,局部b设置为4。

在 print 中,从 q 调用,a 是全局的(值为 3),b 是 q 中的局部(值为 4)。

在最后一步,在函数 print 中,我们看到了与静态作用域的区别。使用静态范围 a 和 b 将是全局范围。使用动态作用域,我们必须查看调用函数的链,在 q 中我们找到一个变量 b,这将是 print 中使用的 b。

【讨论】:

    【解决方案2】:

    C 不是动态范围的语言。如果您想通过实验来了解差异,最好使用 Perl 之类的语言,它可以让您在两者之间进行选择。

    【讨论】:

    • 是的,我知道,但这本书使用 C 语法只是为了方便。
    猜你喜欢
    • 2014-04-19
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2012-05-02
    • 2013-11-06
    相关资源
    最近更新 更多