《看聊天记录都学不会C语言?太菜了吧》(新)变量也有“地盘”?同名不同命的变量,就像班花和校花!
1. 同名变量就像班花和校花刚学C语言时最让我懵圈的就是明明写了两个同名变量程序居然不报错比如这段代码#include stdio.h void dance() { int girl 班花; printf(舞蹈社的%s在练芭蕾\n, girl); } int main() { int girl 校花; dance(); printf(全校公认的%s在主席台演讲\n, girl); }运行后居然能正常输出舞蹈社的班花在练芭蕾 全校公认的校花在主席台演讲这就像学校里同名的班花和校花——虽然都叫小美但一个是班级女神一个是全校偶像。C语言的变量也有自己的地盘专业术语叫作用域不同作用域的同名变量互不干扰。2. 变量的地盘规则大揭秘2.1 全局变量 vs 局部变量想象学校公告栏全局变量和班级黑板局部变量#include stdio.h char notice[100] 全校停课; // 公告栏全局变量 void class_activity() { char notice[100] 明天交班费; // 黑板局部变量 printf(班级通知%s\n, notice); // 优先看黑板 } int main() { class_activity(); printf(学校通知%s\n, notice); // 看公告栏 }输出结果班级通知明天交班费 学校通知全校停课关键点局部变量就像班级黑板只在当前函数/代码块内有效全局变量像学校公告栏整个程序都能访问同名时局部变量优先就像学生先看班级黑板2.2 代码块作用域的实战陷阱我初学时就踩过这个坑#include stdio.h int main() { int score 90; if (score 80) { int score 85; // 这个score只在if内有效 printf(临时分数%d\n, score); } printf(最终分数%d\n, score); // 这里用的是外层的score }输出临时分数85 最终分数90血泪教训在if/for/while等代码块内定义的变量就像临时便签纸——出了这个块就被销毁了3. 变量的寿命比你想的更重要3.1 生命周期对比表变量类型诞生时机死亡时机类比局部变量执行到定义行离开当前代码块临时便签全局变量程序启动程序结束学校公告栏static局部变量第一次执行到定义行程序结束带锁的私人储物柜3.2 static变量的神奇用法想让函数记住上次的值试试static#include stdio.h void counter() { static int count 0; // 只会初始化一次 count; printf(这是第%d次调用\n, count); } int main() { counter(); // 第1次 counter(); // 第2次 counter(); // 第3次 }输出这是第1次调用 这是第2次调用 这是第3次调用原理static让局部变量升级成长生不老模式但作用域仍限制在函数内就像带锁的私人储物柜只有你能用但东西永远在那。4. 命名冲突的避坑指南4.1 变量命名三大禁忌抢关键字int int 10; // 报错int是关键字跨作用域混淆void test() { int x 1; if (x 0) { int x 2; // 合法但极易混淆 } }全局变量滥用int flag; // 全程序都能改危险 void A() { flag 1; } void B() { flag 2; } // 可能被意外修改4.2 推荐命名方案全局变量加前缀g_g_max_score静态变量加前缀s_s_cache_size局部变量用短名称i循环计数器、tmp临时值5. 从原理看变量存储编译时不同变量会被安排到不同内存区域全局/静态变量放在数据区长期保存局部变量放在栈区随用随清动态分配变量放在堆区手动管理用这个命令可以查看Linux程序的内存布局size ./a.out输出示例text data bss dec hex filename 1234 567 89 1890 762 a.out其中data段就存放着全局/静态变量。刚开始写项目时我总喜欢把所有变量都定义成全局的结果调试时发现某个值莫名其妙被改了排查了三小时才发现是另一个函数偷偷修改了全局变量。后来我养成了好习惯能用局部变量就不用全局变量必须用全局时就加g_前缀。理解变量作用域就像明白什么时候该用班级群什么时候该发朋友圈——分清场合才能避免社会性死亡啊