int x;
int main() {
x = 14;
f();
g();
}
void f() {
int x = 13;
h();
}
void g() {
int x = 12;
h();
}
void h() {
printf("%d\n",x);
}
如果使用静态作用域,结果是什么?如果使用动态范围,结果是什么?
现在,如果我正确理解了作用域,静态作用域和动态作用域之间的区别在于,静态使变量成为类的局部变量。所以值 x
将是 void f()
、void g()
和 int main ()
的本地值和动态将使它们在全局范围内可用。我只是不确定如何将其应用于此代码。如果使用静态范围,它是否只打印最后一个值(来自 void g()
的 12),而动态范围将使用 x
的所有值?
我对范围界定的实际工作方式有点困惑。我知道 C
虽然使用静态范围。
最佳答案
静态作用域意味着 x
指的是 x
声明的最内层声明范围 有一个。由于 h
是在全局范围内声明的,所以最里面的 x
是全局范围内的(它无法访问 x
中的f
和 g
,因为它没有在其中声明),所以程序打印 14
两次。
动态范围意味着 x
指的是在最近的 调用堆栈帧 中声明的 x
。如果 C 使用动态范围,h
将使用 f
或 g
中的 x
- 无论哪个调用它- 所以程序会打印 13
和 12
.
https://stackoverflow.com/questions/19461503/