📄 一句话概括
变量就是内存里一块"带标签的空间",里面的值可以改。它有三个要素:类型(这个空间多大、能装什么样的数)、名字(标签,以后靠它找到这块空间)、值(现在装的内容)。常量是"刻在石头上",变量是"写在白板上"——程序真正干活,靠的全是变量:用户的输入、计算的结果、临时记的账,都要先找块地方存起来。
一、变量到底是什么
int age = 18;
这一行做三件事:
① 在内存里要一块 4 字节的空间 ← 由类型 int 决定
② 给这块空间贴个标签 age ← 这个名字以后代表这块空间
③ 往里面放一个 18 ← 当前的值
内存的比喻:
| 概念 | 储物柜的类比 |
|---|---|
| 内存 | 一整排柜子 |
| 变量 | 租下的某一个柜子 |
| 类型 | 柜子的规格(小格/大格;装数字的还是装字符的) |
| 名字 | 柜门上的编号标签 |
| 值 | 柜子里现在装的东西 |
| 常量 | 焊死的、不让换的柜子 |
为什么要用变量:程序要处理"会变的数据"。你让用户输入一个数,这个数是多少事先不知道,必须先准备一块地方接着——那块地方就是变量。
二、三要素各由什么决定
| 要素 | 由什么决定 | 例子 | 讲在哪一节 |
|---|---|---|---|
| 类型 | 你写的时候指定 | int double char bool |
2.3.3~2.3.5、2.4 |
| 名字 | 你自己起(有命名规则) | age totalPrice |
2.3.1 标识符 |
| 值 | 声明时给或以后赋值 | = 18 |
2.3.2 声明与赋值 |
三者缺一不可:没有类型,编译器不知道要留多大地方;没有名字,你以后找不回这块地方;没有值,里面是"没扫干净的垃圾"(2.3.2 会讲这个坑)。
三、变量和常量的关系
int age = 18; // 变量:18 可以改成 19
const int MAX = 100; // 常量:100 不许改(2.2.5)
唯一的分界线就是"许不许改"。所以:
- 该变的用变量:计数器、累加和、用户输入、计算结果
- 不该变的用常量:税率、圆周率、最大长度——凡是"业务规则里的固定值",一律用常量,防止自己或同事手滑改掉
一条实战经验:写代码时,先想"这个值会不会变"。会变 → 变量;不会变 → 常量。把不该变的写成变量,是 bug 的温床。
四、动手 Demo:第一个"会变"的程序
新建 var.cpp:
#include <iostream>
using namespace std;
int main() {
int age = 18; // 声明 + 初始化
cout << "今年 " << age << " 岁" << endl;
age = age + 1; // 把里面的值拿出来加 1,再放回去
cout << "明年 " << age << " 岁" << endl;
int a = 3, b = 4; // 一次声明多个
cout << "a + b = " << a + b << endl;
return 0;
}
看到什么算成功:
今年 18 岁
明年 19 岁
a + b = 7
关键观察:age = age + 1; 这行——等号右边先算,再存回左边。它不是数学方程(数学上 age = age + 1 无解),而是赋值语句:把右边算完的结果,放进左边那个盒子里。这是新手第一个思维转折点。
30 秒实验:把 int a = 3, b = 4; 改成 a = 3, b = 4;(去掉 int,只保留已经存在过的变量赋值),看看能不能过——不能过,因为 a、b 这时还不存在(先声明,后使用)。
五、常见误区
- "
age = age + 1是解方程"——不是。C++ 里的=是"赋值"(把右边放到左边),不是"相等"。判断相等要用==(第 4 章) - "变量不用声明,写个名字就能用"——不行。必须先声明(说明类型和名字),才能使用;否则报
was not declared in this scope - "变量名随便起,反正编译器不看"——编译器确实不挑,但人看。
a1、a2、aaa这种名字,一周后你自己都看不懂 - "变量声明了就有值"——不一定。声明不带初始值时,里面是"不确定的垃圾值"(2.3.2 会亲手试)
自测三问(点开对答案)
1. 变量的三要素是什么?——**类型**(多大、装什么)、**名字**(标签)、**值**(现在装的内容)。 2. 变量和常量的核心区别?——**能不能改**:变量可改,常量不可改。 3. `age = age + 1;` 是什么意思?——把 `age` 里的值取出、加 1、再**存回去**;这是赋值语句,不是数学等式。- ☑ 标识符