Skip to content

第 3 章 程序的记忆盒子——变量


🏗️ 前情回顾:第 2 章你写出了 Hello World,让屏幕显示了一行字。但每次想换一个数字展示,都得重新改代码、重新编译——太麻烦了。这章我们要让程序学会"记住东西"。


🎯 本章目标

学完这一章,你能:

  • 理解什么是变量——它为什么叫"变"量
  • 正确声明、赋值、使用变量
  • 遵循 C++ 的变量命名规则和命名习惯
  • 区分声明和赋值
  • 知道什么是未初始化变量的危险

📖 故事引入

小明记性不好。每次要用一个数字,他都重新输一遍。

第一天:算 3 + 5 → 他在纸上写 3 和 5,算出 8

第二天:用昨天的 8 继续算 → 他又得重新输一遍 3 + 5

第三天……他烦了,心想:"我就不能把 8 存起来吗?给它贴个标签,什么时候要用就拿过来?"

这就是变量的由来。变量 = 内存里的一个贴了标签的格子。你把数字放进去,给它取个名字。以后要用这个数字,叫它名字就行。


🧱 知识讲解

3.1 变量是什么

把计算机的内存想象成一排排储物柜。每个柜子可以放一个数字。

声明一个变量 = 你找一个空柜子,贴上一张标签,规定这个柜子里放什么东西。

给变量赋值 = 你把东西放进这个柜子。

使用变量 = 你按标签找到柜子,取出里面的东西。

cpp
int score;      // 声明:找一个柜子,标签写 score,专门放整数
score = 95;     // 赋值:把 95 放进 score 的柜子
cout << score;  // 使用:打开 score 柜子,取出里面的数 → 95

3.2 声明变量

声明变量的格式:

类型  变量名;

目前我们用 int(整数)这个类型——你已经在 int main() 里见过它了:

cpp
int age;      // 声明一个装整数的变量,叫 age
int count;    // 声明一个装整数的变量,叫 count

可以一行声明多个同类型的变量:

cpp
int a, b, c;  // 声明三个 int 变量

也可以声明的同时赋值(这叫初始化):

cpp
// ❌ 错误示范:声明了但没赋值就使用
int score;
cout << score;  // 输出垃圾值,可能是随机数字!

// ✅ 正确写法:声明时立刻初始化
int score = 100;    // 声明并初始化为 100
int year = 2026;    // 声明并初始化为 2026

💡 现在你只用 int 就够。下章你会打开新世界——C++ 还有专门存小数、存文字、存"对/错"的类型。先打好变量的基本功。

3.3 变量命名规则

C++ 给变量命名有严格的规定,也有约定俗成的习惯。规定是铁律,习惯是修养。

硬性规定(违反会报错)

  1. 只能由字母(A-Z, a-z)、数字(0-9)、下划线(_)组成
  2. 第一个字符不能是数字
  3. 不能是 C++ 的关键字(比如 intreturnif

合法 vs 非法示例

变量名合法?原因
score字母组成
my_score字母+下划线
player2字母开头,含数字
2player数字不能开头
my-score不能有减号
int关键字
我的分数不能有中文(某些编译器允许但不推荐)

推荐习惯(不遵守不会报错,但别人会皱眉)

  1. 变量名要有意义。scores 好,studentCountx
  2. 用英文。哪怕英文不好,也比拼音强——length > changdu
  3. 多个单词用下划线连接(max_score)或驼峰命名(maxScore),任选一种、保持一致

💡 一个好变量名 = 不用看上下文就知道它是干什么的。

3.4 赋值

= 在 C++ 里不是"等于",而是**"把右边的值放进左边的变量"**。

⚠️ 很多初学者在这里栽跟头。看看下面的对比:

cpp
// ❌ 数学思维(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 未初始化的危险

声明变量时不赋值,变量里是什么?

cpp
int x;
cout << x;  // 输出什么?可能是 0,可能是 32767,可能是一个内存垃圾值

答案是:不确定。取决于那块内存之前被谁用过、留下了什么垃圾数据。

⚠️ 未初始化变量是 C++ 中最常见的 bug 来源之一。变量声明时,养成同时赋初始值的习惯

如果你确实不知道初始值该设多少,可以设 0:

cpp
int sum = 0;       // 累加器,从 0 开始
int maxVal = -1;   // 最大值标记

3.6 声明和赋值的不同写法

以下四种写法效果完全一样,都是声明一个 int 变量 score 并设为 100:

cpp
// 写法一:声明和赋值分开
int score;
score = 100;

// 写法二:声明同时初始化(推荐)
int score = 100;

// 写法三:用括号初始化
int score(100);

// 写法四:用大括号初始化(C++11 风格)
int score{100};

推荐写法二——最简单、最清晰。

3.7 常量和 const

有些值在整个程序运行期间都不该变。比如一年有 12 个月,一个班最多 50 人。

C++ 用 const 关键字来标记"这个变量不可更改":

cpp
const int MONTHS = 12;      // 月份数,不会变
const int MAX_SCORE = 100;  // 满分,不会变
MAX_SCORE = 120;            // ❌ 编译错误!常量不能修改

竞赛中,常量用在几个经典场景:

  • 数组最大大小(const int MAXN = 100005;
  • 模数(const int MOD = 1000000007;

(数组和模数是什么?后面会学到。现在只需要知道 const 能让变量变成"只读"。)


✋ 动手试试

试试 1:运行下面的代码,观察输出:

cpp
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)myVarmyvar 在 C++ 中是同一个变量。( )

4. 代码补全

请在空格处填上合适的代码,让程序输出"小明的年龄是 12 岁":

cpp
#include <iostream>
using namespace std;
int main() {
    ______ age ______ 12;
    cout << "小明的年龄是 " ______ age ______ " 岁" << endl;
    return 0;
}

提高题

5. 分析题

下列代码输出什么?先推算,再验证。

cpp
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题。从单变量→多变量→表达式→取模,变量操作的所有基本模式全覆盖。。★核心(课堂必做) ◆拓展(课后练习)

级别题号链接覆盖知识点
★ 核心J0001https://hydro.ac/d/srqc/p/J0001int声明、cin、cout、算术
◆ 拓展J0002https://hydro.ac/d/srqc/p/J0002多变量、中间结果暂存
◆ 拓展luogu-B2001https://hydro.ac/p/luogu-B2001变量、cin/cout、格式匹配
◆ 拓展luogu-B2007https://hydro.ac/p/luogu-B2007双变量、加法
◆ 拓展luogu-B2008https://hydro.ac/p/luogu-B2008三变量、混合运算、括号优先级
◆ 拓展luogu-B2009https://hydro.ac/p/luogu-B2009整除/浮点除法、类型差异初现
◆ 拓展luogu-B2028https://hydro.ac/p/luogu-B2028取模%、逐位拆解、变量复用

💡 练习建议:先完成 1 道★核心题,确保掌握本章基本方法;再完成 6 道◆拓展题,覆盖不同变式和细节。


配套练习

共7题。从单变量→多变量→表达式→取模,变量操作的所有基本模式全覆盖。★核心(课堂必做) · ◆拓展(课后练习)

级别题号链接覆盖知识点
★ 核心J0001https://hydro.ac/d/srqc/p/J0001int声明、cin、cout、算术
◆ 拓展J0002https://hydro.ac/d/srqc/p/J0002多变量、中间结果暂存
◆ 拓展luogu-B2001https://hydro.ac/p/luogu-B2001变量、cin/cout、格式匹配
◆ 拓展luogu-B2007https://hydro.ac/p/luogu-B2007双变量、加法
◆ 拓展luogu-B2008https://hydro.ac/p/luogu-B2008三变量、混合运算、括号优先级
◆ 拓展luogu-B2009https://hydro.ac/p/luogu-B2009整除/浮点除法、类型差异初现
◆ 拓展luogu-B2028https://hydro.ac/p/luogu-B2028取模%、逐位拆解、变量复用

练习建议:先在课堂完成 1 道★核心题,掌握本章基本方法;课后完成 6 道◆拓展题,覆盖不同变式和细节。

自查清单

  • [ ] 我能声明并初始化 int 变量
  • [ ] 我知道变量命名规则
  • [ ] 我理解 = 是赋值不是等于
  • [ ] 我知道未初始化变量的危险
  • [ ] 我会用 const 声明常量

🚀 下章预告:int 存整数够了。但 3.14 怎么办?名字怎么办?对错怎么办?下一章打开另外五种类型的门。