第4章 变量与常量:从定义到面试官都点赞

变量和常量,说白了就是C语言里存数据的“盒子”。
你想想看,写程序不就是处理数据吗?
数据放哪?怎么放?能不能改?
嗯,这一章就把这些事彻底讲清楚。

4.1 变量的定义与初始化

定义变量很简单:类型 名字;
但光定义不赋值,里面是啥?
是垃圾值。我刚开始学C时踩过这个坑——
定义了一个计数器没初始化,结果程序跑起来像个疯子。

⚠️ 警告:局部变量不初始化,值是随机的。
全局变量和静态变量默认初始化为0,但别依赖这个“潜规则”。

所以,定义时顺手初始化,是个好习惯:

int count = 0;          // 定义并初始化为0
double pi = 3.14159;    // 浮点数初始化
char grade = 'A';       // 字符初始化

也可以先定义,再赋值:

int age;
age = 25;               // 先定义,后赋值

我个人习惯是:定义时能初始化就初始化
这样代码更安全,别人看你的代码也少些疑惑。

4.2 命名规则:别让名字成为灾难

C语言的命名规则,其实就几条硬规矩:

  • 只能包含字母、数字、下划线
  • 不能以数字开头
  • 不能是关键字(比如 intreturn
  • 大小写敏感(ageAge 是两个变量)

但规矩之外,还有“潜规则”:

风格 示例 适用场景
下划线命名 student_name Linux内核、驱动开发
驼峰命名 studentName Windows、嵌入式应用
匈牙利命名 iCount 老Windows代码(现在少用了)
💡 我的建议:团队用啥你用啥。
如果自己写项目,我推荐下划线命名——
清晰、易读,而且和标准库风格一致。

我曾经在一个项目里看到变量名叫 abc……
三个月后,原作者自己都看不懂了。
所以,名字要能表达含义,别偷懒。

4.3 const关键字:让变量“只读”

const 是C语言里一个很实用的关键字。
它告诉编译器:这个变量一旦初始化,就不能再改了。

const double PI = 3.14159;
PI = 3.14;  // ❌ 编译错误!const变量不能修改

你可能会问:为什么不用 #define
嗯,const 有类型检查,#define 只是文本替换。
在调试时,const 变量能看到值,#define 看不到。

🔑 核心要点:
const 修饰的变量,本质还是变量,只是加了“只读”属性。
它占用内存,有地址,可以用指针取地址(但别通过指针改它)。

我在项目中常用 const 来定义配置参数:

const int MAX_BUFFER_SIZE = 1024;
const char* const WELCOME_MSG = "Hello, World!";

第二个例子有点意思:
第一个 const 表示字符串内容不能改,
第二个 const 表示指针本身不能改。
这叫“双重const”,面试常考。

4.4 字面量常量:直接写在代码里的值

字面量就是直接写在代码里的“裸值”:

42          // 整数字面量
3.14        // 浮点数字面量
'A'         // 字符字面量
"Hello"     // 字符串字面量

它们没有名字,就是值本身。
编译器会为它们分配空间,但你不能取地址(字符串字面量除外)。

举个例子:

int x = 100;      // 100 是整数字面量
char c = 'Z';     // 'Z' 是字符字面量

字面量类型由后缀决定:

后缀 类型 示例
int 100
L long 100L
LL long long 100LL
U unsigned 100U
F float 3.14F
💡 小技巧:写嵌入式代码时,
我习惯给字面量加后缀,避免隐式类型转换的坑。
比如 100U 明确是无符号数。

4.5 符号常量(#define):预处理阶段的“替换”

#define 是预处理指令,不是C语句。
它做的只是“文本替换”——在编译之前把名字换成值。

#define PI 3.14159
#define MAX_LEN 100

使用的时候:

double area = PI * r * r;
int arr[MAX_LEN];

预处理器会把 PI 换成 3.14159
MAX_LEN 换成 100
所以 #define 没有类型,没有作用域,没有地址。

⚠️ 注意:#define 只是文本替换,
如果写成 #define SQUARE(x) x*x
调用 SQUARE(1+2) 会变成 1+2*1+2,结果是5,不是9。
记得加括号:#define SQUARE(x) ((x)*(x))

我曾经在代码里看到这样的宏:

#define DOUBLE(x) x+x
int y = DOUBLE(3) * 2;  // 结果是 3+3*2 = 9,不是12

嗯,这就是不熟悉“文本替换”的后果。
所以,宏定义一定要加括号,尤其是参数和整个表达式。

4.6 知识体系图:变量与常量

下面这张图帮你理清本章的核心逻辑:

变量与常量 变量 定义与初始化 命名规则 const关键字 常量 字面量常量 #define符号常量 面试重点:const vs #define

4.7 避坑指南:我踩过的那些坑

  • 变量未初始化:局部变量默认是垃圾值,别指望是0。
  • 命名太随意int a1, a2, a3; 这种代码,三天后你自己都看不懂。
  • const指针乱用const int *pint *const p 含义不同,面试常考。
  • 宏定义不加括号#define SQUARE(x) x*x 是经典错误。
  • 字面量类型不匹配100 默认是 int,赋值给 long long 可能出问题。
📌 面试官最爱问:
const#define 有什么区别?”
答案要点:
  • const 有类型,#define 无类型
  • const 在编译阶段处理,#define 在预处理阶段
  • const 有作用域,#define 全局有效
  • const 可以调试,#define 看不到

好了,这一章的内容就是这些。
变量和常量是C语言的基石,搞懂了它们,后面的路会顺很多。
记住:定义时初始化,命名要清晰,const和#define各有所长


公众号:蓝海资料掘金营,微信deep3321