- 编译器确定变量规则:
- 当在函数内访问一个变量时,编译器首先在当前函数的局部作用域中查找该变量。如果找到了,就使用局部变量。
- 如果在当前函数局部作用域未找到,编译器会在外部作用域(按照嵌套层次从内向外)查找,直到找到该变量或者到达全局作用域。如果在全局作用域找到了,就使用全局变量。如果一直未找到,则会报错。
- 代码示例:
#include <iostream>
// 全局变量
int num = 10;
void outerFunction() {
// 与全局变量同名的局部变量
int num = 20;
std::cout << "outerFunction: num = " << num << std::endl;
void innerFunction() {
// 与全局变量同名的局部变量
int num = 30;
std::cout << "innerFunction: num = " << num << std::endl;
}
innerFunction();
}
int main() {
outerFunction();
std::cout << "main: num = " << num << std::endl;
return 0;
}
- 具体解释:
- 在
outerFunction
中,定义了局部变量num
,值为20。当在outerFunction
中访问num
时,编译器在该函数局部作用域找到了num
,所以输出outerFunction: num = 20
。
- 在
innerFunction
中,又定义了一个局部变量num
,值为30。当在innerFunction
中访问num
时,编译器在该函数局部作用域找到了num
,所以输出innerFunction: num = 30
。
- 在
main
函数中,没有定义局部变量num
,当访问num
时,编译器在全局作用域找到了num
,值为10,所以输出main: num = 10
。