在下面的代码中,2
打印出来。
int x = 1;
int f(int y)
{
return x;
}
int main() {
x = 2;
printf("%d", f(0));
}
如果我们在 C 中有静态作用域,会发生什么?为什么不1
打印?
在这种情况下打印2
不是动态范围,是吗?
我认为在静态作用域中,它应该采用最接近函数定义的 x。
在下面的代码中,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("%d\n", f(x));
}
在词法作用域下,f
返回x
词法上“最近”的值 - 全局值。
所以它会打印0
;
在动态作用域下,f
将返回 latest 的值x
,即main
.
所以它会打印1
.
范围界定在这里没有实际意义,因为您没有声明一个x
local 否则会影响global x
。
2
被打印。
x
在使用参数调用之前立即分配main
给。2
f
0
(概念上int x = 1;
是在输入之前运行main
。)
这是编译器生成汇编/机器代码的方式。
因此,如果您想要在 main-function 范围内使用不同的 X,您应该创建一个新对象,就像 nwp 的答案一样。