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 之前,

xmain 中分配给 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.