C语言高频面试题——局部变量和全局变量可以重名吗?
在C语言中,局部变量和全局变量可以重名。当局部变量和全局变量重名时,局部变量会优先于全局变量,这种现象被称为变量作用域的遮蔽(Shadowing)。
1. 变量的作用域
-
全局变量:
- 定义在函数外部,作用域为整个文件(或跨文件,通过
extern
声明)。 - 生命周期从程序开始到程序结束。
- 定义在函数外部,作用域为整个文件(或跨文件,通过
-
局部变量:
- 定义在函数内部或代码块中,作用域仅限于该函数或代码块。
- 生命周期从进入作用域开始,到离开作用域结束。
2. 局部变量和全局变量重名时的行为
当局部变量和全局变量重名时,局部变量会遮蔽(Shadow) 全局变量,即在局部变量的作用域内,全局变量不可见。如果需要访问被遮蔽的全局变量,可以通过 ::
或其他方式显式指定(C++ 中支持 ::
,但 C 语言不支持)。
示例代码
#include <stdio.h>int x = 10; // 全局变量void func() {int x = 20; // 局部变量,与全局变量重名printf("Inside func: x = %d\n", x); // 输出局部变量的值
}int main() {printf("Global x = %d\n", x); // 输出全局变量的值func(); // 调用函数return 0;
}
输出结果
Global x = 10
Inside func: x = 20