📘变量的作用域

2026-09-10
⭐ GESP 3级

📖概念讲解

【考点 · 3级】变量的作用域,属于 C++ 基础语法 —— 变量能在哪些地方被"看见"和使用。


【说人话】

作用域就是变量的"有效范围"。在花括号 {} 里定义的变量,只能在那个花括号里用。出了花括号就"死了",编译器不认识它。

三个核心规则:

💡 易错点:for 循环里定义的 i,出了循环就没了。很多人在循环外还想用 i,结果编译报错。解决办法:把 i 定义在循环外面。

💻代码示例

1#include <iostream>
2using namespace std;
3
4int g = 100; // 全局变量,整个文件都能用
5
6void test() {
7 int x = 10; // 局部变量,只在 test 函数内有效
8 int g = 10; // 同名!遮蔽了全局变量 g=100
9 cout << "test函数内 g=" << g << endl; // 输出 10(用的是局部的)
10}
11
12int main() {
13 cout << "main里 g=" << g << endl; // 输出 100(用的是全局的)
14
15 for (int i = 0; i < 5; i++) { // i 只在 for 的 {} 内有效
16 cout << i << " "; // 循环内正常用 i
17 }
18 // cout << i; // ❌ 编译报错!i 已经不存在了
19
20 int x = 99; // 这个 x 和 test() 里的 x 完全无关
21 { // 新的花括号 = 新的作用域
22 int x = 42; // 遮蔽了外面的 x=99
23 cout << "内层 x=" << x << endl; // 输出 42
24 }
25 cout << "外层 x=" << x << endl; // 输出 99(内层结束,恢复外层)
26
27 return 0;
28}
29// 输出:main里 g=100
30// 0 1 2 3 4
31// 内层 x=42
32// 外层 x=99

🧩互动小测

第 1 题:下面这段代码输出什么?

int a = 5; { int a = 10; cout << a << " "; } cout << a;

第 2 题:for 循环结束后,i 的值是?

for (int i = 0; i < 3; i++) {} cout << i;

第 3 题:下面代码中,全局变量 x 被使用了几次?

int x = 1; void f() { cout << x; } void g() { int x = 2; cout << x; } int main() { f(); g(); }

🏋️动手练一练

📝 编程练习

写一个程序,用 嵌套作用域 来模拟一个"层级"关系:

• 定义全局变量 level = 0
• main 里定义局部变量 level = 1
• 在一个 {} 块里定义 level = 2
• 在那个块里再嵌套一个 {},定义 level = 3

每一层都输出当前的 level 值。
提示:注意每次定义新同名变量都会遮蔽外层的,但出了花括号又恢复。
参考答案:
#include <iostream>
using namespace std;
int level = 0;  // 全局 level
int main() {
    int level = 1;  // 遮蔽全局
    cout << "第1层: " << level << endl;
    {  // 第二层作用域
        int level = 2;  // 遮蔽外层
        cout << "第2层: " << level << endl;
        {  // 第三层作用域
            int level = 3;  // 遮蔽外层
            cout << "第3层: " << level << endl;
        }  // 第三层结束,level 恢复为 2
        cout << "回到第2层: " << level << endl;
    }  // 第二层结束,level 恢复为 1
    cout << "回到第1层: " << level << endl;
    return 0;
}
// 输出:第1层: 1
//       第2层: 2
//       第3层: 3
//       回到第2层: 2
//       回到第1层: 1

要点:每进入一个 {} 定义同名变量就产生遮蔽,出了 {} 就恢复。这就是作用域的本质 —— 内层优先,外层兜底。

📝易错点提醒

学完这个知识点后点一下