12 KiB
算术运算符与关系运算符
1. 引言
- 问题引入:想象一下,你要编写一个游戏。角色的生命值被敌人攻击后会减少,捡到血包后会增加;你的得分会随着击败敌人而累加。这些“增加”、“减少”、“累加”的操作,在代码中如何实现呢?答案就是使用算术运算符。
- 价值阐述:算术运算符是编程的基石。无论是简单的数值计算、复杂的科学模拟,还是游戏开发中的逻辑处理,都离不开它们。掌握好算有运算符,是写出任何有意义程序的先决条件。
2. 核心思想
-
思路铺垫:我们从小学就开始学习数学中的“加减乘除”,C++ 中的算术运算符和它们的思想是完全一样的。它们接收一个或两个数值,然后给出一个计算结果。
-
算法精讲:
- 基本运算符:
+,-,*,/,%这五个是我们最熟悉的。+(加法):5 + 2结果是7-(减法):5 - 2结果是3*(乘法):5 * 2结果是10/(除法):5 / 2结果是2(注意:整数除法会舍弃小数部分)%(取模/取余):5 % 2结果是1(计算5除以2的余数)
- 自增/自减运算符:在编程中,"让一个变量加 1" 这个操作极其频繁。每次都写
a = a + 1;会有点繁琐。于是,C++ 提供了一个更简洁、更高效的写法:++和--。++(自增): 让变量的值加 1。a++或++a都等价于a = a + 1。--(自减): 让变量的值减 1。a--或--a都等价于a = a - 1。
- 基本运算符:
-
步骤拆解 (前置与后置的关键区别) 这是一个非常重要的知识点,也是初学者的一个难点。让我们把它拆解清楚:
-
前置:
++a或--a- 第一步:先让变量
a的值改变(加 1 或减 1)。 - 第二步:再把
a改变后的新值,用于整个表达式的计算。
- 口诀:先变,再用。
- 第一步:先让变量
-
后置:
a++或a--- 第一步:先使用变量
a原始的、未改变的值,用于整个表达式的计算。 - 第二步:再让变量
a的值改变(加 1 或减 1)。
- 口诀:先用,再变。
- 第一步:先使用变量
-
3. 实例
-
具体案例:我们通过两个简单的
cout输出来看看前置和后置的差别。 -
分步演示 1:前置
++xint x = 5; cout << ++x << endl; // 我们想知道这里会输出什么计算机的执行过程:
- 遇到
++x,这是一个前置自增。 - 第一步 (先变):
x的值从5变为6。 - 第二步 (再用):使用
x改变后的新值6来执行cout输出。 - 最终结果:屏幕上输出
6。
分步演示 2:后置
y++int y = 5; cout << y++ << endl; // 这里又会输出什么? cout << y << endl; // 这一行又输出什么?计算机的执行过程:
- 遇到
y++,这是一个后置自增。 - 第一步 (先用):使用
y原始的值5来执行cout输出。所以第一行会输出5。 - 第二步 (再变):在第一行
cout语句执行完毕后,y的值从5变为6。 - 执行第二行
cout << y;时,y的值已经是6了。 - 最终结果:屏幕上第一行输出
5,第二行输出6。
- 遇到
-
复合赋值运算符 还有一些方便的简写形式,它们将算术运算和赋值结合起来,以下的例子中
a与b均为整型变量:a += b;等价于a = a + b;a -= b;等价于a = a - b;a *= b;等价于a = a * b;a /= b;等价于a = a / b;a %= b;等价于a = a % b;
第二部分:关系运算符
-
问题引入:假设你要编写一个程序,判断一个学生的分数是否及格(大于等于60分)。或者,在一个游戏中,判断玩家的生命值是否已经降到了0。这些“是否大于等于”、“是否等于”的操作,单纯用算术运算符是无法完成的。我们需要新的工具来让程序进行比较和判断。
-
价值阐述:如果说算术运算符让程序有了计算能力,那么关系运算符则赋予了程序决策能力。它是构建所有复杂逻辑(如
if语句、循环)的基础。没有关系运算,程序就只是一台高级计算器,无法根据不同的情况做出不同的反应。 -
学习目标:
- 理解并掌握
bool(布尔) 类型,知道它只有true和false两个值。 - 熟练使用 C++ 的 6 个关系运算符:
==,!=,>,<,>=,<=。 - 理解关系运算符的运算结果是一个
bool值。 - 掌握算术运算符和关系运算符混合使用时的优先级规则。
- 理解并掌握
2. 核心思想
-
思路铺垫:认识一个新的数据类型
bool类型 在学习比较之前,我们得先知道比较的结果是什么。生活中的比较,结果通常是“是”或“否”。- “你的年龄大于18岁吗?” -> “是” 或 “否”
- “今天下雨了吗?” -> “是” 或 “否”
在 C++ 中,我们用一种专门的类型来存储这种“是/否”、“真/假”的值,它就是
bool(布尔) 类型。 true(真): 代表“是”、“成立”。在计算机内部,通常用1来表示。false(假): 代表“否”、“不成立”。在计算机内部,通常用0来表示。
bool isAdult = true; // 定义了一个 bool 类型的变量 isAdult 的值是 true bool isRaining = false; // 定义了一个 bool 类型的变量 isRaining 的值是 false -
关系运算符的种类 关系运算符就是用来比较两个值,其实很多关系与数学上是相同的。
| 运算符 | 名称 | 含义 | 例子 (a=5, b=10) | 结果 |
|---|---|---|---|---|
== |
等于 | 判断两边的值是否相等 | a == 5 |
true |
!= |
不等于 | 判断两边的值是否不相等 | a != b |
true |
> |
大于 | 判断左边的值是否大于右边 | a > b |
false |
< |
小于 | 判断左边的值是否小于右边 | a < b |
true |
>= |
大于等于 | 判断左值是否大于或等于右值 | a >= 5 |
true |
<= |
小于等于 | 判断左值是否小于或等于右值 | b <= a |
false |
- 运算符优先级
当一个表达式里既有算术运算符又有关系运算符时,谁先算?比如
3 + 4 > 2 * 3。 规则很简单:先算术,后关系。- 最高级:括号
(),永远最先计算。 - 第二级:乘、除、取余
*,/,%。 - 第三级:加、减
+,-。 - 第四级:大小关系
>,<,>=,<=。 - 第五级:相等关系
==,!=。
- 最高级:括号
3. 实例
-
具体案例:分析表达式
3 + 4 > 2 * 3的计算过程。 -
分步:
- 扫描表达式:
3 + 4 > 2 * 3 - 应用优先级规则:
*的优先级高于+和>。- 计算
2 * 3,得到6。表达式变为3 + 4 > 6。
- 计算
- 再次扫描表达式:
3 + 4 > 6 - 应用优先级规则:
+的优先级高于>。- 计算
3 + 4,得到7。表达式变为7 > 6。
- 计算
- 最后一步:执行关系运算
7 > 6。这个比较是成立的,所以结果是true。
- 扫描表达式:
-
而在
cout中直接输出bool值时,true会显示为1,false会显示为0。所以cout << (3 + 4 > 2 * 3);会输出1。
4. 代码实现
-
问题:(书本 P33 例 3-1) 输入两个整数
a和b,判断并输出:a是否大于b?a是否小于或等于b?a是否不等于b? 输出 3 个整数(1 代表真,0 代表假),用空格隔开。
-
完整代码:
#include <iostream> using namespace std; int main() { // 定义需要输入的两个整型变量 int a, b; // 从键盘读取 a 和 b 的值 cin >> a >> b; // 计算第一个关系表达式 (a > b) 的结果并输出, a > b 的结果是一个 bool 值 (true 或 false) // cout 会自动将 true 转为 1, false 转为 0 cout << (a > b) << " "; // 计算第二个关系表达式 (a <= b) 的结果并输出 cout << (a <= b) << " "; // 计算第三个关系表达式 (a != b) 的结果并输出 cout << (a != b) << endl; return 0; } -
代码解读:
cin >> a >> b;: 等待用户输入两个整数,分别存入变量a和b。cout << (a > b) << " ";: 这一行是核心。(a > b): 括号不是必须的,但加上能让代码更清晰。计算机会先执行括号里的a > b。- 假如输入
10 5,则10 > 5结果为true。 cout << true;:cout会将true以整数1的形式打印到屏幕上。<< " ";: 紧接着输出一个空格,用于分隔结果。
- 其他两行
cout的逻辑完全相同。
5. 验证与深化
- **常见问题 **
-
最大的陷阱:
==和=的区别是什么?==(两个等号) 是关系运算符,用来判断左右两边是否相等。它返回一个bool值。例如if (a == 5)是在问“a 等于 5 吗?”。=(一个等号) 是赋值运算符,用来把右边的值赋给左边的变量。例如a = 5;是在命令“让 a 的值变成 5”。- 最常犯的错误就是在需要判断的地方写了赋值,例如
a = 5,这会导致逻辑错误且很难发现!请务必牢记!
-
y++所在的这行代码结束后,y的值到底变了没有?- 绝对变了! 后置运算符的“后”指的是在“使用”之后,但在整个语句结束之前,变量的值就已经更新了。只要记住口诀“先用旧值,再变新值”就不会错。
-
任何数字都能转成
bool类型吗?- 是的。C++ 有一个规则:非零即为真。
- 当一个整数或浮点数转换为
bool类型时,只要它的值不是0,就转为true。只有0会转为false。 - 例如:
(bool) -3的结果是true,(bool) 100的结果是true,而(bool) 0的结果是false。
-
6. 总结与练习
- 要点回顾
- 算术运算符:
+,-,*,/(整除),%(取余)。 - 自增/自减:
++和--是+1和-1的简写。 - 前置 vs 后置:
++a(先变后用),a++(先用后变)。 bool类型:专门存储true(1) 和false(0) 的类型,是判断的基础。- 关系运算符:
==,!=,>,<,>=,<=,它们的结果都是bool类型。 - 优先级:先算术,后关系。括号优先级最高。
- 算术运算符:
- 拓展思考
我们已经学会了如何进行一次比较,比如
a > b。但如果我想判断“一个数x是否既大于 0 又小于 10”呢?这需要两个关系运算同时成立。要连接多个关系表达式,我们就需要学习下一讲的内容——逻辑运算符 (&&,||,!)。它们是构建更复杂判断逻辑的桥梁。