Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C+中的静态作用域+;_C++_C_Scoping_Dynamic Scope - Fatal编程技术网

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。