在下面的代码中,打印2
。
int x = 1;
int f(int y)
{
return x;
}
int main() {
x = 2;
printf("%d", f(0));
}
如果我们在 C 中有静态作用域,情况如何?为什么不打印1
?
在这种情况下,打印2
不是动态范围,是吗?
我认为在静态作用域中,它应该采用最接近函数定义的 x。
它确实需要最近的x
,但由于您只有一个x
因此并不重要。
如果将代码更改为
int x = 1;
int f(int y)
{
return x ;
}
int main() {
int x=2;
printf("%d", f(0));
}
所以你有 2 个x
,全局的和本地的main
您将看到1
被打印。
这些通常称为动态和词汇范围。
词法范围完全在编译时确定,动态范围在运行时确定。
您只有一个名为"x"的变量,因此作用域与您的程序无关。
这是一个程序,根据范围规则会有所不同:
int x = 0;
int f()
{
return x;
}
int main()
{
int x = 1;
printf("%dn", f(x));
}
在词法作用域下,f
返回词法上"最接近"x
的值 - 全局值。
所以它会打印0
;
在动态作用域下,f
将返回最新x
的值,即main
中的值。
所以它会打印1
.
范围在这里没有意义,因为您没有在本地声明一个x
,否则会掩盖全局x
。
打印2
。
x
在用参数 0
调用之前立即将 main
分配给2
f
。
(从概念上讲,int x = 1;
在输入main
之前运行。
这是编译器生成程序集/机器代码的方式。
- 第一个全局变量 X 存储在内存位置"abc"中
- 下一个 main 被执行:全局变量 X 在 "abc" 处更改为 2
- 现在调用函数 f():
- 函数 f 返回全局变量 X 在 "abc" 处的值:为 2
- 打印 f() 的返回值。
因此,如果你想在主函数作用域中使用不同的 X,你应该创建一个新对象,就像 nwp 的答案一样。