动态和静态范围

时间:2014-10-15 02:36:58

标签: scope

我和我的朋友在理解静态和动态范围方面遇到了一些麻烦。我相信动态,变量​​(全局)将继续被其他函数更新,直到打印,而对于静态,我认为任何值被赋予变量的第一个就是这样。

这种想法是正确还是没有?

有关使用上述想法的示例,我已从此代码段计算了以下内容。

int a, b, c;
void p() {
    int a = 3;
    b = 1;
    c = a + b;
    q();
}
void print() { printf(“%d %d %d\n”, a, b, c); }

void q() {
    int b = 4;
    a = 5;
    c = a + b;
    print();
}
main() {
    int c = 5; 
    p();
} 
Output with static scoping: 315
Output with dynamic scoping: 549

2 个答案:

答案 0 :(得分:1)

使用静态作用域时,print会失败,因为abc都未在print内或{{}}范围内分配值{1}} 已定义(即文件的第一行)。

使用动态作用域,输出将为549,因为printab中的每一个都在c中分配了值。您的代码未证明的事实是qq内的调用返回后, local 变量p在{{中设置了值5 1}},而不是全局变量。即,发生以下情况:

  1. 声明了全局变量aqa,但没有值。我们假设您的语言将这些值初始化为0。

  2. b被调用。 c本地变量main的值为c;全局main仍然等于0.

  3. 5被调用。 c - 局部变量p的值为3;全局p仍为0。

  4. a或其来电者a中不存在本地变量b,因此全局p设置为1。

  5. main中不存在局部变量b,但c中存在局部变量,其值设置为3 + 1 = 4.

  6. p被调用。声明了本地c并将其设置为4,将全局q设置为0.

  7. b中不存在本地变量b,但其调用者a中有一个,因此该值从3更改为5.

  8. q或其来电者p中不存在本地变量c,但q来电者p中存在,因此该值设置为5 + 4 = 9.全局p仍为0.

  9. main被调用,缺少任何本地cprinta,它会在其调用链中回顾。它使用b中的ca中的pb中的q(不使用全局变量。

  10. c返回。在main中,qp的值仍然是a中设置的5和9。 c仍为1,因为q宣布为本地b

  11. q返回。在b,我们仍然有p(因为main在调用a=0之前声明了自己的副本),p(因为q修改了全局b=1)和p(因为b最终将变量本地修改为c=9)。

  12. q返回。我们仍有全球cmaina=0

  13. 如果这让人感到困惑(我并没有让自己迷惑并犯下任何错误),你可能会理解为什么大多数语言使用静态作用域:它不仅更容易,而且可能更容易关于程序行为的原因,而不必运行或模拟它只是为了跟踪变量赋值。

答案 1 :(得分:0)

static scoping- 5 1 9 //它将全局值作为未在print函数中定义的变量

动态范围 - 5 4 9