← 课程目录
第 2 讲 模块一:认识编程

数字与变量

2 / 24
💡
本节课目标
今天你会让程序"记住"数字,用 intdouble 声明变量, 掌握算术运算和运算优先级,理解整数除法的陷阱与解决方法, 并学会 ++--+= 这类常用快捷写法。
第一段

变量:程序的记忆

📖 理论讲解

为什么程序需要记住数据

上节课我们用 cout 输出了固定的文字,比如 "Hello, World!"。 但程序更多时候要处理会变化的数据—— 玩家的血量、商品的价格、今天的气温。

如果每次都把数字写死在代码里,程序就"死了":无法计算,无法更新,无法响应用户。 变量就是解决这个问题的工具——它是一个有名字的"容器", 可以存入一个值,之后随时读取或修改。

Python

Python:直接写名字和值

age = 14

score = 95

height = 1.75

Python 自动判断你存的是整数还是小数

VS
C++

C++:先写类型,再写名字

int age = 14;

int score = 95;

double height = 1.75;

必须告诉 C++ 这个容器装的是哪种数

📖 理论讲解

为什么 C++ 必须写类型

C++ 是编译型语言——运行之前,编译器把代码整体翻译成机器指令。 编译器需要提前知道每个变量占多少内存,才能合理安排空间。

int 整数占 4 个字节double 小数占 8 个字节。 你写 int age,编译器准备 4 字节;写 double height,准备 8 字节。

Python 在运行时才检查类型,所以不用提前声明。C++ 要求提前声明,换来的是更快的运行速度。

这节课先掌握两种类型
int(整数,如 14、100、-5)和 double(带小数点的数,如 3.14、1.75)。 第四节课还会介绍 string(文字)。先把这两个用熟,其他类型用到时再学。
第二段

int:存整数

📖 理论讲解

一个小简化:using namespace std

上节课每次都写 std::coutstd::endl,前缀 std:: 有些冗长。 在程序开头加一行 using namespace std;,之后可以直接写 cout,省去 std::

上节课的写法 CPP
// 上节课的写法——每次都要带 std::
std::cout << "Hello" << std::endl;
从这节课开始 CPP
// 开头加这一行
using namespace std;

// 之后省略所有 std::
cout << "Hello" << endl;
💡
namespace 是什么
std 是 C++ 标准库的"命名空间",可以理解成一个分类文件夹。 std::cout 的意思是"std 文件夹里的 cout"。 using namespace std; 相当于告诉程序:我默认就用这个文件夹,不用每次写路径了。
📖 理论讲解

声明一个 int 变量

语法:类型 变量名 = 初始值;

写法说明
int age = 14; 声明并直接赋初始值(推荐)
int score;
score = 95;
先声明,后赋值(两步走)
int a = 1, b = 2; 一行声明多个(合法,但可读性差,不推荐)

注意:同一个变量只能声明一次(写一次 int),但可以被赋值很多次。

variables.cpp CPP
#include <iostream>
using namespace std;

int main() {
    int age = 14;
    int score = 95;

    cout << "年龄:" << age << endl;
    cout << "分数:" << score << endl;
    return 0;
}
📖 理论讲解

修改变量的值

"变量"之所以叫变量,就是因为它能变。把新值直接赋给变量名就行, 不需要再写类型。还可以用变量自身参与计算后再存回去:

modify.cpp CPP
int age = 14;
cout << "今年:" << age << endl;    // 输出 14

age = 15;                           // 直接赋新值(不加 int)
cout << "明年:" << age << endl;    // 输出 15

age = age + 1;                      // 用自身参与计算
cout << "后年:" << age << endl;    // 输出 16
⚠️
常见错误:重复声明
int age = 14; 之后又写 int age = 15;——这是错误的。 同一个变量在同一作用域内不能声明两次。修改值直接写 age = 15;,不加 int
⚡ 动手实操 约 10 分钟

练习:声明变量并输出

写一个完整程序,完成以下要求:

  1. 声明三个 int 变量:你的年龄、班级人数、你最喜欢的游戏评分(满分 100)
  2. cout 把三个值都输出出来,每行一个,加上标签(如 "年龄:14"
  3. 把年龄改成明年的年龄,再输出一次
变量和文字可以一起输出
cout << "年龄:" << age << endl; —— 文字用引号,变量直接写名字,用 << 连起来。
第三段

变量命名规则

📖 理论讲解

什么名字是合法的

不是任意字符串都能当变量名。C++ 有几条硬规则:

规则合法示例非法示例
只能用字母、数字、下划线 _ score1 my-score(含 -
不能以数字开头 level1 1level
区分大小写 ageAge 是两个不同变量
不能是 C++ 关键字 myInt intreturn
不能有空格 totalScore total score
📖 理论讲解

命名惯例:驼峰式(camelCase)

有几种合法的命名风格,C++ 变量最常用的是小驼峰:第一个单词全小写,之后每个单词首字母大写。

风格示例常见场景
小驼峰 camelCase totalScoreplayerHealth 变量名(本课统一用这个)
下划线 snake_case total_scoreplayer_health C 语言、Python 风格
全大写 SCREAMING_CASE MAX_SCOREPI 常量(之后会学)

不同项目可能有不同规范,但同一个项目内要保持一致

⚠️
常见关键字(这些词不能用作变量名)
intdoublereturnmainifelseforwhiletruefalse…… 在 Dev-C++ 里,这些词会自动变色——看到变色就说明它是关键字,不能当变量名。
⚡ 动手实操 约 5 分钟

快速判断:合法还是非法

下面这些名字,哪些合法?哪些有问题?口头判断,不用写代码:

变量名合法?如果非法,原因是?
myScore————
2ndPlace————
player_hp————
int————
total price————
_backup————
💡
答案
合法:myScoreplayer_hp_backup
非法:2ndPlace(数字开头)、int(关键字)、total price(有空格)。
第四段

算术运算与运算优先级

📖 理论讲解

五个算术运算符

符号名称示例结果
+加法10 + 313
-减法10 - 37
*乘法10 * 330
/除法10 / 33(注意!)
%取余(模)10 % 31

% 是取余数,Python 里你们也用过。10 % 3 = 1, 因为 10 ÷ 3 商 3 余 1。常见用途:判断奇偶(n % 2 == 0 就是偶数)。

📖 理论讲解

运算优先级:和数学课完全一样

C++ 的运算顺序和数学一致:先乘除取余,后加减,括号最优先

不确定优先级时,直接加括号——括号是免费的,可以无限套。

order_of_ops.cpp CPP
int a = 2 + 3 * 4;      // 先乘:结果 14
int b = (2 + 3) * 4;    // 先括号:结果 20
int c = 10 / 3;          // 整数除法:结果 3
int d = 10 % 3;          // 余数:结果 1

cout << a << endl;    // 14
cout << b << endl;    // 20
cout << c << endl;    // 3
cout << d << endl;    // 1
⚡ 动手实操 约 8 分钟

猜输出:先猜,再验证

下面每行代码会输出什么?先在纸上写下你的答案,再输入程序运行验证:

代码你猜的结果实际结果
cout << 3 + 4 * 2 << endl;————
cout << (3 + 4) * 2 << endl;————
cout << 17 % 5 << endl;————
cout << 9 / 2 << endl;————
cout << 9 % 2 << endl;————
cout << 100 - 3 * 10 + 5 << endl;————
最意外的那道
很多人会把 9 / 2 写成 4.5。运行后你会发现是 4—— 这正是下面要讲的整数除法陷阱
📖 理论讲解

整数除法陷阱:/ 不总是你想的那个除法

/ 两侧都是 int 时,结果也是 int—— 小数部分会被直接截断丢弃(不是四舍五入)。

7 / 2  →  3,不是 3.5
1 / 4  →  0,不是 0.25
99 / 100  →  0,不是 0.99

这是 C++ 初学者最常踩的坑之一。写计算程序时,如果结果莫名其妙变成 0 或差很远, 先检查有没有两个 int 相除。

int_div.cpp CPP
#include <iostream>
using namespace std;

int main() {
    int x = 7;
    int y = 2;

    cout << x / y << endl;    // 输出 3,不是 3.5!
    cout << x % y << endl;    // 输出 1(7 除以 2 余 1)
    return 0;
}
⚠️
看到结果是 0?先查这里
整数除法在计算百分比、平均分时特别容易出问题。 比如 int avg = totalScore / count;,如果 totalScore 比 count 小,结果直接是 0。 第五段会教你怎么修复这个问题。
第五段

double:存小数,以及修复整数除法

📖 理论讲解

什么时候用 double

需要带小数点的数时用 double。常见场景:

  • 身高、体重、温度等测量值
  • 价格、税率、折扣比例
  • 需要精确的数学计算结果(面积、平均分)

纯计数、序号、循环次数等用 int 就够。 不确定时,只要结果可能出现小数,就选 double

double_basic.cpp CPP
#include <iostream>
using namespace std;

int main() {
    double height = 1.75;
    double weight = 60.5;

    cout << "身高:" << height << " 米" << endl;
    cout << "体重:" << weight << " 千克" << endl;
    return 0;
}
📖 理论讲解

int 和 double 一起算:自动类型提升

如果 / 两侧有一个是 double,结果就是 double,小数不会丢失。

表达式结果原因
7 / 23两个 int,整数除法
7.0 / 23.5左边是 double,结果提升为 double
7 / 2.03.5右边是 double,结果提升为 double
📖 理论讲解

强制类型转换:彻底解决整数除法陷阱

如果两个变量都已经是 int,可以用 (double) 把其中一个临时转换成 double,再做除法,结果就会保留小数。

语法:(目标类型)变量名,这叫做强制类型转换(cast)。 注意:这只是本次计算中的临时转换,原变量的类型和值并不会改变。

type_cast.cpp CPP
int x = 7;
int y = 2;

cout << x / y << endl;            // 3(两个 int,直接截断)
cout << (double)x / y << endl;    // 3.5(先把 x 临时变成 double,再除)
⚡ 动手实操 约 12 分钟

练习:几何计算器

写一个程序,完成下面两个计算:

  1. 已知长方形长 8、宽 5,输出面积和周长
  2. pi = 3.14159,圆的半径 r = 3,输出圆的面积(= pi × r × r)
💡
类型选什么
长、宽用 intdouble 都行; pi 必须是 double; 存放面积结果的变量也要用 double,否则小数会丢失。
进阶:故意制造整数除法错误
试着把圆面积的计算写成 int 版本,看看输出有什么问题, 再用类型转换修复它。感受"陷阱"真正发生时的样子,印象会更深。
第六段

快捷写法:++ 和 +=

📖 理论讲解

自增与自减:++ 和 --

C++ 这个名字本身就来自 ++:意思是"比 C 更进一步"。 ++ 是一个运算符,表示"把变量加 1"。

count++ 完全等价于 count = count + 1, 但更简洁,在循环中会大量用到。 同理,count-- 等价于 count = count - 1

increment.cpp CPP
int count = 0;
count++;                   // 等价于 count = count + 1
cout << count << endl;     // 1

count--;                   // 等价于 count = count - 1
cout << count << endl;     // 0
💡
前置 ++ 和后置 ++ 的区别
count++(后置)和 ++count(前置)都是把变量加 1。 区别在于放进表达式里时:后置先用当前值,前置先加再用。 单独写 count++; 时两者效果相同。这节课只用后置就行,遇到需要区分的场景再细讲。
📖 理论讲解

复合赋值运算符:+=、-=、*=、/=

除了 ++,还有一组"运算并赋值"的快捷符号,对应所有五个算术运算符:

快捷写法等价的完整写法
score += 10score = score + 10
score -= 5score = score - 5
score *= 2score = score * 2
score /= 4score = score / 4
score %= 3score = score % 3

Python 里 += 的写法和 C++ 完全一样——这是你们已经熟悉的东西。

compound.cpp CPP
int score = 100;

score += 20;    // score = 120
score -= 5;     // score = 115
score *= 2;     // score = 230
score /= 10;    // score = 23

cout << score << endl;    // 23
⚡ 动手实操 约 8 分钟

练习:用快捷写法改写

把下面这段代码用快捷写法改写,结果必须完全相同:

改写前 CPP
int hp = 100;
hp = hp - 20;
hp = hp + 50;
hp = hp * 2;

int coins = 500;
coins = coins - 150;
coins = coins + 300;
参考答案
hp -= 20;  ·  hp += 50;  ·  hp *= 2;  ·  coins -= 150;  ·  coins += 300;
第七段

综合练习与收尾

练习 2-3

购物小票计算器

写一个程序,模拟一张购物小票的计算过程。数字直接写在变量里,不需要用户输入。

要求:

  • int 存数量,double 存单价
  • 计算小计(单价 × 数量)
  • 计算税费(小计 × 0.1,即 10%)
  • 计算总价(小计 + 税费)
  • cout 格式化输出,像一张收据

参考输出:

参考输出 TEXT
========================
        购物小票
========================
单价:29.9 元
数量:3 件
小计:89.7 元
税费:8.97 元
总计:98.67 元
========================

分层目标:

  • 基础版:输出小计和总价两行
  • 进阶版:加上税费,格式化成完整小票样式
  • 挑战版:见下一个练习
加分挑战

加上折扣,计算实付金额

在练习 2-3 的基础上加入折扣。假设商品打 八折(折扣率 = 0.8):

  • 先算出折后单价(原价 × 0.8)
  • 用折后单价重新计算小计、税费、总价
  • 同时输出原价和折后价,让用户看到省了多少钱

思考:折扣率 0.8 该存成 int 还是 double? 如果存成 int 会发生什么?

课堂展示
完成后展示你的小票!看看谁的输出格式最整齐、最像一张真实的收据。 同样的功能,每个人排版可以不一样。
💡
下节课预告
这节课的数字都是你自己写死在代码里的。 下节课我们用 cin 让用户在运行时自己输入—— 不同的用户输入不同的价格和数量,程序都能算出正确结果。 程序真正"活"起来了。