C++ C/C+中的静态作用域+;
在以下代码中,将打印C++ C/C+中的静态作用域+;,c++,c,scoping,dynamic-scope,C++,C,Scoping,Dynamic Scope,在以下代码中,将打印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) {
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
,否则它会隐藏全局x
2
已打印
int x = 1;
int f(int y)
{
return x;
}
int main() {
x = 2;
printf("%d", f(0));
}
x
在main
中分配给2
,紧接着使用参数0
调用f
(从概念上讲,
intx=1;
在输入main
之前运行。)这是编译器生成程序集/机器代码的方式
- 第一个全局变量X存储在内存位置“abc”中
- 执行下一个main:将“abc”处的全局变量X更改为2
- 现在调用函数f():
- 函数f返回全局变量X在“abc”处的值:为2
- 将打印f()的返回值
因此,如果您希望在主函数作用域中使用不同的X,您应该创建一个新对象,如nwp的回答。这些通常称为动态和词汇作用域 词法作用域完全在编译时确定,动态作用域在运行时确定 您只有一个名为“x”的变量,所以作用域与您的程序无关 以下是一个根据范围规则而有所不同的程序:
int x = 0;
int f()
{
return x;
}
int main()
{
int x = 1;
printf("%d\n", f(x));
}
在词法范围下,f
返回词法上“最近”的x
的值,即全局值。因此它将打印
0
在动态作用域下,f
将返回最新的x
的值,这是main
中的值因此它将打印
1
您在这里只声明一个x
(作为全局变量)。因此,在代码的任何地方进行的任何修改都会影响以后在代码的任何其他地方的使用。为什么会这样呢?x不是常数,在返回之前会被修改。它取最近的一个(虽然只有一个可供选择),赋值发生在函数调用之前,所以ofc打印2。因为C++和C++(几乎所有其他编程语言)都是从上到下执行代码的。“你应该做一个新的对象,比如NWP的答案。”这不是在NWP的代码中发生的,而是你使用的是世界上最糟糕的编译器。但是看到问题的简单性,我不想详细说明编译器的细节;)最后一行给我的印象是,printf(“%d”,f(x))代码>会打印2为什么会这样,我无法理解。@SurajJain你能更具体一点吗?我的意思是为什么我们不能打印那个值,我不明白你的答案。@SurajJain所说的“该值”是指本地intx=2代码>内部main
?因为f
中的x
查找“最近的”x
,它是全局的。查找是在编译时通过只查看f
和向上查看而完成的,而没有在运行时检查调用f
的位置,因为这样做既慢又容易混淆。我的意思是为什么值2正在打印,它应该正确打印1,因为f(0)应该返回1。