👇😊 C语言作用域规则 😊👇


🌈 1. 作用域是什么?

想象你家的房间🏠:

  • 客厅的零食🍿 → 全家人都能拿(全局变量
  • 你抽屉里的日记📔 → 只有你能看到(局部变量
    作用域就是变量的“可见范围”——出了这个区域,变量就“隐身”了!👻

🌈 2. 变量的三种身份

2.1 局部变量(Local Variables)

  • 位置:在函数或代码块内部定义
  • 寿命:函数被调用时“出生”,函数结束“死亡”💀
  • 特点:只能在所属函数/代码块内使用

🌰 例子

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

void myFunction() {
int localVar = 5; // 局部变量
printf("Inside function: %d\n", localVar); // 正常输出5
}

int main() {
myFunction();
// printf("%d", localVar); ❌ 错误!localVar在这里不可见
return 0;
}

常见错误:在代码块外使用局部变量

1
2
3
4
5
6
int main() {
if(1) {
int x = 10; // x的作用域只在if块内
}
printf("%d", x); ❌ 错误!x已经“死了”
}

2.2 全局变量(Global Variables)

  • 位置:在所有函数外部定义
  • 寿命:程序启动时“出生”,程序结束时“死亡”⚰️
  • 特点:所有函数都能访问和修改它!

🌰 例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int globalVar = 100; // 全局变量

void func1() {
globalVar += 10; // 修改全局变量
}

void func2() {
printf("GlobalVar: %d\n", globalVar); // 输出110(如果func1被调用过)
}

int main() {
func1();
func2(); // 输出110
return 0;
}

⚠️ 危险操作:局部变量同名覆盖全局变量

1
2
3
4
5
6
int num = 50; // 全局变量

void func() {
int num = 20; // 局部变量
printf("%d", num); // 输出20,全局变量被“屏蔽”!
}

2.3 形式参数(Formal Parameters)

  • 位置:函数定义的参数列表
  • 寿命:函数被调用时“出生”,函数结束“死亡”💀
  • 特点:本质是函数的局部变量,优先于全局变量

🌰 例子

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int a = 99; // 全局变量

void check(int a) { // 形式参数a是局部变量
printf("参数a: %d\n", a); // 输出5,优先使用局部变量
}

int main() {
check(5);
return 0;
}

🌈 3. 变量初始化陷阱

变量类型 默认初始值 必须手动初始化?
全局变量 0(int)、0.0(float)等 否 ✅
局部变量 随机值(垃圾值)🗑️ 是 ❗

🌰 例子:未初始化的局部变量导致问题

1
2
3
4
5
int main() {
int x; // 未初始化
printf("%d", x); // 输出随机值,可能是-32421、0等!
return 0;
}

危险代码

1
2
3
4
5
int sum;
for(int i=1; i<=10; i++) {
sum += i; // sum未初始化,结果不可预测!
}
printf("%d", sum); // 可能是奇怪的数值!

正确做法

1
2
3
4
int sum = 0; // 初始化!
for(int i=1; i<=10; i++) {
sum += i; // 正确累加
}

🌈 4. 内存中的变量存储

变量类型 存储位置 特点
全局变量 全局/静态存储区 程序整个生命周期存在
局部变量 栈区(Stack) 函数结束时自动释放

🌰 比喻

  • 全局变量 → 公共储物柜🗄️,随时存取
  • 局部变量 → 临时寄存柜📦,用后清空

🌈 5. 综合练习:测测你掌握了吗?

练习1:猜输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int x = 10; // 全局变量

void test() {
int x = 20;
printf("%d ", x);
}

int main() {
test();
printf("%d", x);
return 0;
}

答案:20 10


练习2:找错误

以下代码有什么问题?如何修正?

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

void printSum() {
int a = 5, b = 10;
printf("Sum: %d", a + b);
}

int main() {
printSum();
printf("%d", a); // 这里有问题!
return 0;
}

错误原因aprintSum的局部变量,不能在main中使用
修正:删除printf("%d", a);


练习3:写代码

写一个函数void updateGlobal(),将全局变量count(初始为0)每次调用加1,并在main中调用3次后输出结果。

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int count = 0; // 全局变量

void updateGlobal() {
count++;
}

int main() {
updateGlobal();
updateGlobal();
updateGlobal();
printf("Count: %d", count); // 输出3
return 0;
}

🚀 总结

  • 局部变量:函数内部的小秘密,用完即焚 🔥
  • 全局变量:全程序的公共财产,谨慎使用 ⚠️
  • 形式参数:函数的“临时工”,优先级最高 🥇
  • 初始化:局部变量必须手动初始化,否则后果自负!

记住:作用域是变量的“活动范围”,超出范围就会“消失”!多写代码多调试,变量作用域不再迷路! 🧭💻