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

数字与变量

2 / 24
💡
本节课目标
今天你会让程序“记住”数字,用 intdouble 声明变量, 掌握基础算术运算,理解整数除法的陷阱与解决方法, 最后做出一个能计算总价的购物小票程序。
第一段

变量:程序的记忆

📖 理论讲解

为什么程序需要记住数据

上节课我们用 std::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++ 这个容器装的是哪种数

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

int:存整数

📖 理论讲解

声明一个 int 变量

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

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

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

variables.cpp CPP
#include <iostream>

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

    std::cout << "年龄:" << age << std::endl;
    std::cout << "分数:" << score << std::endl;
    return 0;
}
💡
<<:流插入运算符
std::cout 这一类输出语句里,<< 叫做流插入运算符。 可以先把 std::cout 理解成“输出流”,<< 的作用是把右边的数据插入到这个输出流里。 多个 << 可以连续连接,程序会按从左到右的顺序输出。 比如 std::cout << "年龄:" << age << std::endl;
📖 理论讲解

修改变量的值

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

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

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

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

练习:声明变量并输出

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

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

变量命名规则

📖 理论讲解

什么名字是合法的

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

规则合法示例非法示例
只能用字母、数字、下划线 _ score1 my-score(含 -
不能以数字开头 level1 1level
区分大小写 ageAge 是两个不同变量
不能是 C++ 关键字 myInt intreturn
不能有空格 totalScore total score
命名建议
变量名尽量看得懂,比如 totalScoreplayerHealth。 多个单词可以用小驼峰写法:第一个单词小写,后面的单词首字母大写。
⚠️
常见关键字(这些词不能用作变量名)
intdoublereturnifelseforwhiletruefalse…… 在 CLion 里,这些词会自动变色——看到变色就说明它是关键字,不能当变量名。 main 虽然不是关键字,但它是程序入口函数的特殊名字,也不要拿来当普通变量名。
⚡ 动手实操 约 5 分钟

快速判断:合法还是非法

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

变量名合法?如果非法,原因是?
myScore————
2ndPlace————
player_hp————
int————
total price————
backupValue————
💡
答案
合法:myScoreplayer_hpbackupValue
非法: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 就是偶数)。

📖 理论讲解

运算优先级:和数学课基本一致

本节涉及的加减乘除取余,运算顺序和数学课基本一致: 先乘除取余,后加减,括号最优先

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

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

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

猜输出:先猜,再验证

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

代码你猜的结果实际结果
std::cout << 3 + 4 * 2 << std::endl;————
std::cout << (3 + 4) * 2 << std::endl;————
std::cout << 17 % 5 << std::endl;————
std::cout << 9 / 2 << std::endl;————
std::cout << 9 % 2 << std::endl;————
std::cout << 100 - 3 * 10 + 5 << std::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>

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

    std::cout << x / y << std::endl;    // 输出 3,不是 3.5!
    std::cout << x % y << std::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>

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

    std::cout << "身高:" << height << " 米" << std::endl;
    std::cout << "体重:" << weight << " 千克" << std::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;

std::cout << x / y << std::endl;            // 3(两个 int,直接截断)
std::cout << (double)x / y << std::endl;    // 3.5(先把 x 临时变成 double,再除)
第六段

综合练习与收尾

练习 2-3

购物小票计算器

写一个程序,模拟一张购物小票的计算过程。数字直接写在变量里,不需要用户输入。 已知商品单价是 29.9 元,购买数量是 3 件。

要求:

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

参考输出:

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

分层目标:

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

加上折扣,计算实付金额

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

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

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

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