Static scoping in C/C++

In the following code, 2 is printed.

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

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

How is it happening if we have static scoping in C? Why isn't 1 printed?

Printing 2 in this case isn't a dynamic scoping, is it?

I thought that in static scoping it should take the nearest x to the function definition.


It does take the nearest x , but since you only have one x it doesn't really matter.

If you change the code to

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

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

so you have 2 x , the global one and the local one in main you will see 1 getting printed.


The scoping is moot here since you have not declared an x locally that would have otherwise shadowed the global x .

2 is printed.

x is assigned in main to 2 immediately before f is called with the parameter 0 .

(Conceptually int x = 1; is ran before main is entered.)


It is the way the compiler generates the assembly/machine code.

  • first global variable X is stored in memory location "abc"
  • next main is executed: global variable X at "abc" is changed to 2
  • Now function f() is called:
  • function f returns the value of global variable X at "abc": being 2
  • the return value of f() is printed.
  • So if you wanted a different X in the main-function scope, you should have made a new object, like in the answer by nwp.

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

    上一篇: 函数作用域结束后内存中局部变量的持久性?

    下一篇: C / C ++中的静态作用域