6

所以我有这个问题,我必须使用两个不同的范围规则来计算输出。我知道使用词法作用域的输出是a=3and b=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();
}

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

4

2 回答 2

6

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

总的来说,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。

于 2013-10-24T19:34:12.750 回答
3

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

于 2013-10-24T19:18:34.557 回答