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被打印。

这些通常称为动态和词汇范围。

词法范围完全在编译时确定,动态范围在运行时确定。

您只有一个名为"x"的变量,因此作用域与您的程序无关。

这是一个程序,根据范围规则会有所不同:

int x = 0;
int f()
{
    return x;
}
int main()
{
    int x = 1;
    printf("%dn", f(x));
}

在词法作用域下,f返回词法上"最接近"x的值 - 全局值。
所以它会打印0;

在动态作用域下,f将返回最新x的值,即main中的值。
所以它会打印1.

范围在这里没有意义,因为您没有在本地声明一个x,否则会掩盖全局x

打印2

x 在用参数 0 调用之前立即将 main 分配给2 f

(从概念上讲,int x = 1;在输入main之前运行。

这是编译器生成程序集/机器代码的方式。

  • 第一个全局变量 X 存储在内存位置"abc"中
  • 下一个 main 被执行:全局变量 X 在 "abc" 处更改为 2
  • 现在调用函数 f():
    • 函数 f 返回全局变量 X 在 "abc" 处的值:为 2
  • 打印 f() 的返回值。

因此,如果你想在主函数作用域中使用不同的 X,你应该创建一个新对象,就像 nwp 的答案一样。

最新更新