第 3 章 程序的记忆盒子——变量
🏗️ 前情回顾:第 2 章你写出了 Hello World,让屏幕显示了一行字。但每次想换一个数字展示,都得重新改代码、重新编译——太麻烦了。这章我们要让程序学会"记住东西"。
🎯 本章目标
学完这一章,你能:
- 理解什么是变量——它为什么叫"变"量
- 正确声明、赋值、使用变量
- 遵循 C++ 的变量命名规则和命名习惯
- 区分声明和赋值
- 知道什么是未初始化变量的危险
📖 故事引入
小明记性不好。每次要用一个数字,他都重新输一遍。
第一天:算 3 + 5 → 他在纸上写 3 和 5,算出 8
第二天:用昨天的 8 继续算 → 他又得重新输一遍 3 + 5
第三天……他烦了,心想:"我就不能把 8 存起来吗?给它贴个标签,什么时候要用就拿过来?"
这就是变量的由来。变量 = 内存里的一个贴了标签的格子。你把数字放进去,给它取个名字。以后要用这个数字,叫它名字就行。
🧱 知识讲解
3.1 变量是什么
把计算机的内存想象成一排排储物柜。每个柜子可以放一个数字。
声明一个变量 = 你找一个空柜子,贴上一张标签,规定这个柜子里放什么东西。
给变量赋值 = 你把东西放进这个柜子。
使用变量 = 你按标签找到柜子,取出里面的东西。
int score; // 声明:找一个柜子,标签写 score,专门放整数
score = 95; // 赋值:把 95 放进 score 的柜子
cout << score; // 使用:打开 score 柜子,取出里面的数 → 953.2 声明变量
声明变量的格式:
类型 变量名;目前我们用 int(整数)这个类型——你已经在 int main() 里见过它了:
int age; // 声明一个装整数的变量,叫 age
int count; // 声明一个装整数的变量,叫 count可以一行声明多个同类型的变量:
int a, b, c; // 声明三个 int 变量也可以声明的同时赋值(这叫初始化):
// ❌ 错误示范:声明了但没赋值就使用
int score;
cout << score; // 输出垃圾值,可能是随机数字!
// ✅ 正确写法:声明时立刻初始化
int score = 100; // 声明并初始化为 100
int year = 2026; // 声明并初始化为 2026💡 现在你只用
int就够。下章你会打开新世界——C++ 还有专门存小数、存文字、存"对/错"的类型。先打好变量的基本功。
3.3 变量命名规则
C++ 给变量命名有严格的规定,也有约定俗成的习惯。规定是铁律,习惯是修养。
硬性规定(违反会报错):
- 只能由字母(A-Z, a-z)、数字(0-9)、下划线(_)组成
- 第一个字符不能是数字
- 不能是 C++ 的关键字(比如
int、return、if)
合法 vs 非法示例:
| 变量名 | 合法? | 原因 |
|---|---|---|
score | ✅ | 字母组成 |
my_score | ✅ | 字母+下划线 |
player2 | ✅ | 字母开头,含数字 |
2player | ❌ | 数字不能开头 |
my-score | ❌ | 不能有减号 |
int | ❌ | 关键字 |
我的分数 | ❌ | 不能有中文(某些编译器允许但不推荐) |
推荐习惯(不遵守不会报错,但别人会皱眉):
- 变量名要有意义。
score比s好,studentCount比x好 - 用英文。哪怕英文不好,也比拼音强——
length>changdu - 多个单词用下划线连接(
max_score)或驼峰命名(maxScore),任选一种、保持一致
💡 一个好变量名 = 不用看上下文就知道它是干什么的。
3.4 赋值
= 在 C++ 里不是"等于",而是**"把右边的值放进左边的变量"**。
⚠️ 很多初学者在这里栽跟头。看看下面的对比:
// ❌ 数学思维(C++里不对):
// 以为 x = x + 1 是"x 等于 x+1"(矛盾!)
// ✅ C++ 思维:
int x;
x = 10; // 把 10 放进 x
x = 20; // 把 20 放进 x(原来的 10 被覆盖了)
x = x + 5; // 把 x 当前的值(20)加上 5,结果(25)存回 x最后一行需要仔细理解:先算右边的表达式,再把结果赋给左边。所以 x = x + 5 不是数学上的"x 等于 x+5"(那是不可能的),而是"把 x 加上 5,再存回 x"。
3.5 未初始化的危险
声明变量时不赋值,变量里是什么?
int x;
cout << x; // 输出什么?可能是 0,可能是 32767,可能是一个内存垃圾值答案是:不确定。取决于那块内存之前被谁用过、留下了什么垃圾数据。
⚠️ 未初始化变量是 C++ 中最常见的 bug 来源之一。变量声明时,养成同时赋初始值的习惯。
如果你确实不知道初始值该设多少,可以设 0:
int sum = 0; // 累加器,从 0 开始
int maxVal = -1; // 最大值标记3.6 声明和赋值的不同写法
以下四种写法效果完全一样,都是声明一个 int 变量 score 并设为 100:
// 写法一:声明和赋值分开
int score;
score = 100;
// 写法二:声明同时初始化(推荐)
int score = 100;
// 写法三:用括号初始化
int score(100);
// 写法四:用大括号初始化(C++11 风格)
int score{100};推荐写法二——最简单、最清晰。
3.7 常量和 const
有些值在整个程序运行期间都不该变。比如一年有 12 个月,一个班最多 50 人。
C++ 用 const 关键字来标记"这个变量不可更改":
const int MONTHS = 12; // 月份数,不会变
const int MAX_SCORE = 100; // 满分,不会变
MAX_SCORE = 120; // ❌ 编译错误!常量不能修改竞赛中,常量用在几个经典场景:
- 数组最大大小(
const int MAXN = 100005;) - 模数(
const int MOD = 1000000007;)
(数组和模数是什么?后面会学到。现在只需要知道 const 能让变量变成"只读"。)
✋ 动手试试
试试 1:运行下面的代码,观察输出:
int a = 10;
int b = a; // b 得到 a 的值(10)
a = 20; // 修改 a
cout << a << " " << b << endl; // 输出什么?b 变了吗?为什么?
试试 2:声明一个变量但不初始化,输出它。反复运行几次,每次输出的值一样吗?
试试 3:试着把 int return = 5; 敲进 IDE,看看编译器怎么说。
⚠️ 你踩过这些坑吗
- [ ] 坑 1:把 = 当等于 —
x = x + 1在数学上不可能,但在 C++ 里是"把 x 当前值加 1,存回 x"。 - [ ] 坑 2:不初始化直接用 —
int sum; cout << sum;输出垃圾值。永远写成int sum = 0;。 - [ ] 坑 3:变量名无意义 —
int a, b, c, d;天知道它们代表什么。用int math, english, chinese, total;一看就懂。 - [ ] 坑 4:拼写不一致 — 声明
int studentScore;,使用cout << studentscore;大小写不同,编译错误!
📝 练习
基础题
1. 选择题
(1)以下哪个是合法的变量名?
A. 2name B. my-name C. _count D. int
(2)int x; x = 5; x = 10; 执行后,x 的值是?
A. 5 B. 10 C. 15 D. 不确定
(3)int x = 3; x = x * 2; 执行后,x 的值是?
A. 3 B. 6 C. 9 D. 32
2. 填空题
(1)声明一个 int 变量 score 并初始化为 100:____________________
(2)声明一个不可修改的 int 常量 CLASS_SIZE,值为 45:____________________
(3)变量名不能以 _____ 开头。
3. 判断题
(1)int 2x; 是合法的变量声明。( ) (2)const int X = 10; X = 20; 是正确的。( ) (3)声明变量时可以不初始化。( ) (4)myVar 和 myvar 在 C++ 中是同一个变量。( )
4. 代码补全
请在空格处填上合适的代码,让程序输出"小明的年龄是 12 岁":
#include <iostream>
using namespace std;
int main() {
______ age ______ 12;
cout << "小明的年龄是 " ______ age ______ " 岁" << endl;
return 0;
}提高题
5. 分析题
下列代码输出什么?先推算,再验证。
int a = 5;
int b = a;
a = 8;
b = a + 2;
cout << a << " " << b << endl;6. 编程题
声明三个 int 变量:语文成绩、数学成绩、英语成绩。分别赋值 90、95、88。计算总分并输出。再算平均分——提示:算平均分需要用到小数类型 double,写法是 double avg = total / 3.0;(下章会详细讲 double,这里先用起来)。
7. 简答题
小明写了这样一段代码:int score; score = score + 10; cout << score;。程序运行后输出了一个奇怪的数字。请解释为什么会这样,并写出修改后正确的代码。
挑战题
8. 交换题
有两个杯子,A 杯装着橙汁,B 杯装着苹果汁。怎么把两个杯子里的饮料交换?
对应到编程:int a = 10, b = 20; 怎么让 a 变成 20,b 变成 10?(提示:需要第三个变量帮忙。)
9. 编程题
提示用户输入两个整数,先输出这两个数原本的值,然后交换它们,再输出交换后的值。不准用第 8 题之外的方法——让用户亲眼看到变量被交换了。
🧠 本章小结
变量声明:类型 变量名 [= 初始值];
赋值:变量 = 表达式; (先算右边,再放左边)
目前类型:int(整数)
命名规则:字母/数字/下划线,数字不打头
命名习惯:有意义、用英文、驼峰或下划线
const = 不可修改的常量
初始化 = 好习惯;不初始化 = 垃圾值 = 定时炸弹📝 配套练习
共7题。从单变量→多变量→表达式→取模,变量操作的所有基本模式全覆盖。。★核心(课堂必做) ◆拓展(课后练习)
| 级别 | 题号 | 链接 | 覆盖知识点 |
|---|---|---|---|
| ★ 核心 | J0001 | https://hydro.ac/d/srqc/p/J0001 | int声明、cin、cout、算术 |
| ◆ 拓展 | J0002 | https://hydro.ac/d/srqc/p/J0002 | 多变量、中间结果暂存 |
| ◆ 拓展 | luogu-B2001 | https://hydro.ac/p/luogu-B2001 | 变量、cin/cout、格式匹配 |
| ◆ 拓展 | luogu-B2007 | https://hydro.ac/p/luogu-B2007 | 双变量、加法 |
| ◆ 拓展 | luogu-B2008 | https://hydro.ac/p/luogu-B2008 | 三变量、混合运算、括号优先级 |
| ◆ 拓展 | luogu-B2009 | https://hydro.ac/p/luogu-B2009 | 整除/浮点除法、类型差异初现 |
| ◆ 拓展 | luogu-B2028 | https://hydro.ac/p/luogu-B2028 | 取模%、逐位拆解、变量复用 |
💡 练习建议:先完成 1 道★核心题,确保掌握本章基本方法;再完成 6 道◆拓展题,覆盖不同变式和细节。
配套练习
共7题。从单变量→多变量→表达式→取模,变量操作的所有基本模式全覆盖。★核心(课堂必做) · ◆拓展(课后练习)
| 级别 | 题号 | 链接 | 覆盖知识点 |
|---|---|---|---|
| ★ 核心 | J0001 | https://hydro.ac/d/srqc/p/J0001 | int声明、cin、cout、算术 |
| ◆ 拓展 | J0002 | https://hydro.ac/d/srqc/p/J0002 | 多变量、中间结果暂存 |
| ◆ 拓展 | luogu-B2001 | https://hydro.ac/p/luogu-B2001 | 变量、cin/cout、格式匹配 |
| ◆ 拓展 | luogu-B2007 | https://hydro.ac/p/luogu-B2007 | 双变量、加法 |
| ◆ 拓展 | luogu-B2008 | https://hydro.ac/p/luogu-B2008 | 三变量、混合运算、括号优先级 |
| ◆ 拓展 | luogu-B2009 | https://hydro.ac/p/luogu-B2009 | 整除/浮点除法、类型差异初现 |
| ◆ 拓展 | luogu-B2028 | https://hydro.ac/p/luogu-B2028 | 取模%、逐位拆解、变量复用 |
练习建议:先在课堂完成 1 道★核心题,掌握本章基本方法;课后完成 6 道◆拓展题,覆盖不同变式和细节。
自查清单:
- [ ] 我能声明并初始化 int 变量
- [ ] 我知道变量命名规则
- [ ] 我理解
=是赋值不是等于 - [ ] 我知道未初始化变量的危险
- [ ] 我会用 const 声明常量
🚀 下章预告:int 存整数够了。但 3.14 怎么办?名字怎么办?对错怎么办?下一章打开另外五种类型的门。