【发布时间】:2017-01-24 13:19:11
【问题描述】:
在下面的代码中,2 被打印出来。
int x = 1;
int f(int y)
{
return x;
}
int main() {
x = 2;
printf("%d", f(0));
}
如果我们在 C 中使用静态作用域,会发生什么情况?为什么不打印1?
在这种情况下打印2 不是动态作用域,是吗?
我认为在静态作用域中,它应该采用最接近函数定义的 x。
【问题讨论】:
-
你在这里只声明一个
x(作为一个全局变量)。因此,从代码中的任何位置进行的任何修改都会影响以后从代码的任何其他位置进行的任何使用。 -
为什么会这样? x 不是常量,在返回之前会被修改。
-
它采用最接近的一个(虽然只有一个可供选择)并且分配发生在函数调用之前,因此它会打印 2. Works as expected (TM)。
-
这些通常被称为动态和词法作用域。
-
因为 C 和 C++(以及几乎所有其他编程语言)从上到下执行代码?
标签: c++ c scoping dynamic-scope