MST

星途 面试题库

面试题:C++局部与全局同名变量在复杂函数嵌套中的作用域分析

假设有一个C++程序,包含多层函数嵌套,每层函数内都定义了与全局变量同名的局部变量。请详细分析在不同层次函数中访问该变量时,编译器是如何确定使用哪个变量的,并给出代码示例及具体解释。
28.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 编译器确定变量规则
    • 当在函数内访问一个变量时,编译器首先在当前函数的局部作用域中查找该变量。如果找到了,就使用局部变量。
    • 如果在当前函数局部作用域未找到,编译器会在外部作用域(按照嵌套层次从内向外)查找,直到找到该变量或者到达全局作用域。如果在全局作用域找到了,就使用全局变量。如果一直未找到,则会报错。
  2. 代码示例
#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;
}
  1. 具体解释
    • 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