在下面的代码中,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.
范围界定在这里没有实际意义,因为您没有声明一个xlocal 否则会影响global x。
2被打印。
x在使用参数调用之前立即分配main给。2f0
(概念上int x = 1;是在输入之前运行main。)
这是编译器生成汇编/机器代码的方式。
因此,如果您想要在 main-function 范围内使用不同的 X,您应该创建一个新对象,就像 nwp 的答案一样。