静态范围和动态范围之间的区别

时间:2016-02-11 23:17:15

标签: scope lexical-scope dynamic-scope

我的老师提供了以下伪代码,并说使用静态范围的输出是1 2 3,但使用动态范围的输出是2 3 4

挑战在静态范围我们使用a = 1,b = 2,c = 3而不注意main或no,使用a = 1,b = 2,c = 4?仅在静态范围内,不包括C规则。

void fun1(void);
void fun2(void);

int a=1, b=2, c=3;

int main() {
    c=4;
    fun1();
    return 0;
}

void fun1() {
    int a=2, b=3;
    fun2();
}

void fun2(){
    printf("%d%d%d", a,b,c);
}

1 个答案:

答案 0 :(得分:1)

如果在C中可以使用动态范围,那么在a内查找变量bcfun2将使用动态环境。

这又取决于函数实际调用的方式。由于它是从fun1调用的,因此将使用该范围的变量绑定(因此a = 2b = 3)。由于fun1是从设置绑定main的{​​{1}}调用的,因此输出为c = 4

另一个例子:

2 3 4

打印

void fun1(void);
void fun2(void);
void fun3(void);

int a=1, b=2, c=3;

int main()
{
    c=4;
    fun1();
    int a = 21;
    fun3();
    return 0;
}

void fun1()
{
    int a=2, b=3;
    fun2();
}

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

void fun3() {
  int c = 42;
  fun2();
}

也许实际上看到差异可以帮助你。 Clojure支持动态和词法范围(这是正确的术语,顺便说一下):

2 3 4
21 2 42

(live)

请注意,Clojure尝试尽可能纯粹的功能,因此上面的代码都不是一个赋值(换句话说:变量的值一旦被赋值就不会被修改)