用变量的三步走:声明(int a;——申请一块地方)、赋值(a = 10;——把值放进去)、初始化(int a = 10;——两步合一,推荐)。三条要害:先声明后使用;= 是"赋值"不是"相等"(右边算完放进左边);声明了不等于有值——没初始化的局部变量里是不确定的垃圾值,直接读它属于未定义行为。
一、声明:先把地方定下来
int a; // 声明一个整型变量 a,此时里面还没有"正经值"
double price; // 声明一个实型变量 price
char ch; // 声明一个字符变量 ch
声明的意思:告诉编译器"给我留一块能装 int 的地方,名字叫 a"。至于里面装什么,这时还没说。
二、赋值:把值放进去
a = 10; // 把 10 放进 a 这块地方
price = 9.9;
ch = 'A';
= 的读法:从右往左——"把右边的值,存进左边的空间"。
a = 10; // 读作:把 10 存进 a
b = a; // 读作:把 a 里的值【复制】一份,存进 b
a = a + 1; // 读作:把 a 的值取出加 1,再存回 a
关键区别:数学里 a = a + 1 无解,C++ 里它是最常见的写法(计数器加一)。因为这里的 = 不是"等于",而是"存进去"。判断相等要用 ==(第 4 章)。
三、初始化:一步到位(推荐)
int a = 10; // 声明 + 初始化,最常用
int b = 0; // 不知道该给什么值时,给 0 最安全
为什么推荐初始化——看下面这个真坑:
int a; // 只声明
cout << a << endl; // ✗ 里面是"垃圾值":可能输出 -858993460 之类的怪数
垃圾值是什么:那块内存刚被分配时,里面还留着上一个程序用过的数据。读它就是"读别人没擦干净的白板"——值不确定,每次运行都可能不一样。
| 写法 | 安全性 | 建议 |
|---|---|---|
int a; 然后 a = 10; |
中间有一段"危险期" | 能用,但别让危险期太长 |
int a = 10; |
一步到位 | 首选 |
int a; 之后一直没有赋值就用 |
危险(读垃圾值) | 禁止 |
额外一句:老编译器对未初始化变量的处理各不相同(有的把内存清零、有的不清),所以"我这台机器上跑出来是 0"完全不能作为依据——这是典型的"换台电脑就出 bug"的来源。
四、一次声明多个
int a, b, c; // 三个都没初始化
int x = 1, y = 2, z = 3; // 三个都初始化(推荐写法)
int m, n = 5; // ⚠ 只有 n 是 5!m 仍然是垃圾值
最后那一行是经典陷阱:int m, n = 5; 只给 n 赋了值。多个变量要一起初始化,就每个都写清楚:int m = 0, n = 5;。
五、动手 Demo:三个实验
新建 assign.cpp:
#include <iostream>
using namespace std;
int main() {
int a; // 故意不初始化
cout << "未初始化的 a = " << a << endl;
int b = 10;
b = 20; // 同一变量可以反复赋值
cout << "b = " << b << endl;
int m, n = 5; // ⚠ 只初始化了 n
cout << "m = " << m << " n = " << n << endl;
return 0;
}
看到什么算成功:
- 第一行输出一个说不清的怪数(比如 -858993460、32767),这就是垃圾值
- 多运行几次(F9 反复跑),如果值变了,更说明"它根本不确定"
- 最后一行 m 也是垃圾值、n 是 5——亲眼看到 int m, n = 5; 只初始化了 n
⚠ 提示:有的编译器会在编译时给出警告(类似 'a' is used uninitialized)。看到这种警告别忽略,它真是在救命。
30 秒实验:把 int a; 改成 int a = 0;,警告消失、输出稳定。"给初值"这个动作,能消灭一整类难查的 bug。
六、常见误区
- "声明了就有默认值 0"——局部变量没有默认值(是垃圾值)。只有全局变量/静态变量才是默认 0,那是另一回事
- "
a = 10和a == 10差不多"——差得远。=是赋值(把 10 放进去);==是判断(问"a 是不是 10")。写错这个,程序通常不报错但逻辑全错——这是 C++ 最著名的坑之一(第 4 章会专门讲) - "
int m, n = 5;是两个都等于 5"——只有 n。要两个都赋值就得写int m = 5, n = 5; - "变量声明后类型还能改"——不能。
int a = 1;之后想装小数,得另声明一个double;硬塞进去小数部分会被截掉(第 3 章类型转换)
自测四问(点开对答案)
1. 声明、赋值、初始化分别是什么?——**声明**:申请空间(`int a;`);**赋值**:把值放进去(`a = 10;`);**初始化**:声明时一并给值(`int a = 10;`)。 2. `a = a + 1;` 是什么意思?——取出 `a` 的值加 1,再**存回** `a`;`=` 是赋值不是相等。 3. 未初始化的局部变量里是什么?——**不确定的垃圾值**(内存里残留的旧数据),读它属于未定义行为。 4. `int m, n = 5;` 里 `m` 是多少?——**垃圾值**。只有 `n` 被初始化为 5。- ☑ 整型变量