词汇范围与动态范围

时间:2013-10-24 19:14:27

标签: scope lexical-scope dynamic-scope

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

2 个答案:

答案 0 :(得分:6)

正如我们所知,C没有动态范围,但假设确实如此,程序将打印3 4。

在主要方面,a和b是全球性的。 a将被设置为2,因为我们将看到这将是p将返回的。

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

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

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

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

答案 1 :(得分:3)

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