第4章 变量与常量:从定义到面试官都点赞
变量和常量,说白了就是C语言里存数据的“盒子”。
你想想看,写程序不就是处理数据吗?
数据放哪?怎么放?能不能改?
嗯,这一章就把这些事彻底讲清楚。
4.1 变量的定义与初始化
定义变量很简单:类型 名字;。
但光定义不赋值,里面是啥?
是垃圾值。我刚开始学C时踩过这个坑——
定义了一个计数器没初始化,结果程序跑起来像个疯子。
全局变量和静态变量默认初始化为0,但别依赖这个“潜规则”。
所以,定义时顺手初始化,是个好习惯:
int count = 0; // 定义并初始化为0
double pi = 3.14159; // 浮点数初始化
char grade = 'A'; // 字符初始化
也可以先定义,再赋值:
int age;
age = 25; // 先定义,后赋值
我个人习惯是:定义时能初始化就初始化。
这样代码更安全,别人看你的代码也少些疑惑。
4.2 命名规则:别让名字成为灾难
C语言的命名规则,其实就几条硬规矩:
- 只能包含字母、数字、下划线
- 不能以数字开头
- 不能是关键字(比如
int、return) - 大小写敏感(
age和Age是两个变量)
但规矩之外,还有“潜规则”:
| 风格 | 示例 | 适用场景 |
|---|---|---|
| 下划线命名 | student_name |
Linux内核、驱动开发 |
| 驼峰命名 | studentName |
Windows、嵌入式应用 |
| 匈牙利命名 | iCount |
老Windows代码(现在少用了) |
如果自己写项目,我推荐下划线命名——
清晰、易读,而且和标准库风格一致。
我曾经在一个项目里看到变量名叫 a、b、c……
三个月后,原作者自己都看不懂了。
所以,名字要能表达含义,别偷懒。
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 知识体系图:变量与常量
下面这张图帮你理清本章的核心逻辑:
4.7 避坑指南:我踩过的那些坑
- 变量未初始化:局部变量默认是垃圾值,别指望是0。
- 命名太随意:
int a1, a2, a3;这种代码,三天后你自己都看不懂。 - const指针乱用:
const int *p和int *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