C / C ++中的静态作用域

时间:2017-01-24 13:19:11

标签: 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带到函数定义中。

4 个答案:

答案 0 :(得分:7)

它确实需要最接近的x,但由于您只有一个x,所以它并不重要。

如果您将代码更改为

int x = 1;
int f(int y)
  {
    return x ;
  }

int main() {
    int x=2;       
    printf("%d", f(0));
}

所以你有2 x,全局的main1中的本地版本,你会看到div.polaroid { position:relative; width: 80%; background-color: white; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); margin-bottom: 25px; z-index:1; } div.container { position:relative; background-color: rgba(255,0,0,0.7); text-align: center; margin-top: -37px; z-index:5; color:white; }被打印出来。

答案 1 :(得分:2)

由于在本地宣布x本来会阴影全局2,因此范围界定没有实际意义。

x已打印。

main在使用参数2调用f之前0int x = 1;内分配。

(从概念上main在输入{{1}}之前运行。)

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

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

您只有一个名为“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