2

在下面的代码中,2打印出来。

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

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

如果我们在 C 中有静态作用域,会发生什么?为什么不1打印?

在这种情况下打印2不是动态范围,是吗?

我认为在静态作用域中,它应该采用最接近函数定义的 x。

4

4 回答 4

8

它确实需要最近的x,但是由于您只有一个x,因此并不重要。

如果您将代码更改为

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

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

所以你有 2 xmain你会看到全局的和本地的1被打印出来。

于 2017-01-24T13:22:51.833 回答
3

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

词法作用域完全在编译时确定,动态作用域在运行时确定。

您只有一个名为“x”的变量,因此范围与您的程序无关。

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

int x = 0;

int f()
{
    return x;
}

int main()
{
    int x = 1;
    printf("%d\n", f(x));
}

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

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

于 2017-01-24T13:44:23.237 回答
2

范围界定在这里没有实际意义,因为您没有声明一个xlocal 否则会影响global x

2被打印。

x在使用参数调用之前立即分配main给。2f0

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

于 2017-01-24T13:22:59.203 回答
1

这是编译器生成汇编/机器代码的方式。

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

因此,如果您想要在 main-function 范围内使用不同的 X,您应该创建一个新对象,就像 nwp 的答案一样。

于 2017-01-24T13:28:39.433 回答