C/C++ 中的静态作用域
Static scoping in C/C++
在下面的代码中,打印了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
被打印出来。
这里的范围是没有实际意义的,因为你 not 在本地声明了一个 x
否则 shadowed 全局 x
.
2
被打印出来。
在使用参数 0
. 调用 f
之前,x
在 main
中分配给 2
(概念上 int x = 1;
在输入 main
之前是 运行。)
这是编译器生成 assembly/machine 代码的方式。
- 第一个全局变量 X 存储在内存位置 "abc"
- 接下来执行main:"abc"处的全局变量X改为2
- 现在函数 f() 被调用:
- function f returns "abc"处的全局变量X的值:为2
- 打印 f() 的 return 值。
因此,如果您想在 main-function 范围内使用不同的 X,您应该创建一个新对象,就像 nwp 的回答一样。
这些通常称为动态和 词法 范围。
词法作用域完全在编译时确定,动态作用域在运行时确定。
您只有一个名为 "x" 的变量,因此作用域与您的程序无关。
根据作用域规则,下面的程序会有所不同:
int x = 0;
int f()
{
return x;
}
int main()
{
int x = 1;
printf("%d\n", f(x));
}
在词法作用域下,f
returns x
的值在词法上 "nearest" - 全局值。
所以它会打印 0
;
在动态作用域下,f
将 return 最新 x
的值,即 main
.
中的值
所以它会打印 1
.
在下面的代码中,打印了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
被打印出来。
这里的范围是没有实际意义的,因为你 not 在本地声明了一个 x
否则 shadowed 全局 x
.
2
被打印出来。
0
. 调用 f
之前,x
在 main
中分配给 2
(概念上 int x = 1;
在输入 main
之前是 运行。)
这是编译器生成 assembly/machine 代码的方式。
- 第一个全局变量 X 存储在内存位置 "abc"
- 接下来执行main:"abc"处的全局变量X改为2
- 现在函数 f() 被调用:
- function f returns "abc"处的全局变量X的值:为2
- 打印 f() 的 return 值。
因此,如果您想在 main-function 范围内使用不同的 X,您应该创建一个新对象,就像 nwp 的回答一样。
这些通常称为动态和 词法 范围。
词法作用域完全在编译时确定,动态作用域在运行时确定。
您只有一个名为 "x" 的变量,因此作用域与您的程序无关。
根据作用域规则,下面的程序会有所不同:
int x = 0;
int f()
{
return x;
}
int main()
{
int x = 1;
printf("%d\n", f(x));
}
在词法作用域下,f
returns x
的值在词法上 "nearest" - 全局值。
所以它会打印 0
;
在动态作用域下,f
将 return 最新 x
的值,即 main
.
中的值
所以它会打印 1
.