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会影响全局x因此范围界定在这里是没有意义的。

2被打印。

紧接在用参数0调用f之前, xmain被赋值为2

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


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

  • 第一全局变量X被存储在存储器位置“abc”
  • 执行下一个主要部分:将“abc”处的全局变量X更改为2
  • 现在函数f()被调用:
  • 函数f在“abc”处返回全局变量X的值:为2
  • f()的返回值被打印出来。
  • 所以如果你想在主函数范围内使用不同的X,你应该创建一个新的对象,就像在nwp的答案中一样。

    链接地址: http://www.djcxy.com/p/82491.html

    上一篇: Static scoping in C/C++

    下一篇: How does memory determine data type of variable?