为何函数使用同名全局变量而非main函数中的局部变量?
同名标识符下函数为何使用全局变量而非main中的局部变量?
你疑惑的点在于:代码里全局X=2,main函数里定义了局部X=3,调用Scope()后却输出了全局变量的值。你原本以为函数栈帧嵌套,变量查找应该从局部到全局逐层找,但这里为什么跳过了main里的局部变量?
先看你的代码:
#include <stdio.h> #include <windows.h> int X = 2; void Scope(void); int main() { int X = 3; Scope(); return 0; } void Scope(void) { printf("Entering X = %d\n" ,X); printf("Exiting X = %d\n" , X*X); }
核心原因是你混淆了词法作用域和运行时的栈帧结构:
- C语言采用词法作用域(静态作用域),变量的查找规则是在代码编写时就确定的,和运行时的栈帧嵌套无关。
Scope()是独立于main()的函数,它的作用域链里不包含main()的局部作用域。当Scope()里引用X时,首先检查自身的局部作用域(这里没有声明X),接下来直接查找全局作用域的X,而main()里的X属于main专属的局部作用域,和Scope()的作用域是平级关系,互相没有访问权限。- 只有嵌套定义的代码块(比如
main里的{}子块)或者部分编译器扩展支持的嵌套函数,才会形成作用域嵌套,此时内部作用域可以访问外部作用域的变量。
举个例子验证:如果在Scope()内部声明int X = 4;,那么输出会变成4和16,优先使用自身局部变量;如果把main里的X改成全局变量,才会和原来的全局X产生重定义问题。
内容的提问来源于stack exchange,提问作者M_G_0xFF
相关产品推荐
相关产品推荐

