我的老师提供了以下伪代码,并说使用静态范围的输出是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);
}
答案 0 :(得分:1)
如果在C中可以使用动态范围,那么在a
内查找变量b
,c
和fun2
将使用动态环境。
这又取决于函数实际调用的方式。由于它是从fun1
调用的,因此将使用该范围的变量绑定(因此a = 2
和b = 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
请注意,Clojure尝试尽可能纯粹的功能,因此上面的代码都不是一个赋值(换句话说:变量的值一旦被赋值就不会被修改)