Files

215 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# **算术运算符与关系运算符**
#### 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`
1. **第一步:先**让变量 `a` 的值改变(加 1 或减 1)。
2. **第二步:再**把 `a` **改变后**的新值,用于整个表达式的计算。
* **口诀:先变,再用。**
* **后置**: `a++` 或 `a--`
1. **第一步:先**使用变量 `a` **原始的、未改变的**值,用于整个表达式的计算。
2. **第二步:再**让变量 `a` 的值改变(加 1 或减 1)。
* **口诀:先用,再变。**
#### 3. 实例
* **具体案例**:我们通过两个简单的 `cout` 输出来看看前置和后置的差别。
* **分步演示 1:前置 `++x`**
```cpp
int x = 5;
cout << ++x << endl; // 我们想知道这里会输出什么
```
**计算机的执行过程**:
1. 遇到 `++x`,这是一个前置自增。
2. **第一步 (先变)**:`x` 的值从 `5` 变为 `6`。
3. **第二步 (再用)**:使用 `x` 改变后的新值 `6` 来执行 `cout` 输出。
4. **最终结果**:屏幕上输出 `6`。
**分步演示 2:后置 `y++`**
```cpp
int y = 5;
cout << y++ << endl; // 这里又会输出什么?
cout << y << endl; // 这一行又输出什么?
```
**计算机的执行过程**:
1. 遇到 `y++`,这是一个后置自增。
2. **第一步 (先用)**:使用 `y` **原始的值 `5`** 来执行 `cout` 输出。所以第一行会输出 `5`。
3. **第二步 (再变)**:在第一行 `cout` 语句**执行完毕后**,`y` 的值从 `5` 变为 `6`。
4. 执行第二行 `cout << y;` 时,`y` 的值已经是 `6` 了。
5. **最终结果**:屏幕上第一行输出 `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` 语句、循环)的基础。没有关系运算,程序就只是一台高级计算器,无法根据不同的情况做出不同的反应。
* **学习目标**:
1. 理解并掌握 `bool` (布尔) 类型,知道它只有 `true` 和 `false` 两个值。
2. 熟练使用 C++ 的 6 个关系运算符:`==`, `!=`, `>`, `<`, `>=`, `<=`。
3. 理解关系运算符的运算结果是一个 `bool` 值。
4. 掌握算术运算符和关系运算符混合使用时的**优先级**规则。
#### 2. 核心思想
* **思路铺垫:认识一个新的数据类型 `bool` 类型**
在学习比较之前,我们得先知道比较的结果是什么。生活中的比较,结果通常是“是”或“否”。
* “你的年龄大于18岁吗?” -> “是” 或 “否”
* “今天下雨了吗?” -> “是” 或 “否”
在 C++ 中,我们用一种专门的类型来存储这种“是/否”、“真/假”的值,它就是 `bool` (布尔) 类型。
* `true` (真): 代表“是”、“成立”。在计算机内部,通常用 `1` 来表示。
* `false` (假): 代表“否”、“不成立”。在计算机内部,通常用 `0` 来表示。
```cpp
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`。
规则很简单:**先算术,后关系**。
1. **最高级**:括号 `()`,永远最先计算。
2. **第二级**:乘、除、取余 `*`, `/`, `%`。
3. **第三级**:加、减 `+`, `-`。
4. **第四级**:大小关系 `>`, `<`, `>=`, `<=`。
5. **第五级**:相等关系 `==`, `!=`。
#### 3. 实例
* **具体案例**:分析表达式 `3 + 4 > 2 * 3` 的计算过程。
* **分步**:
1. **扫描表达式**:`3 + 4 > 2 * 3`
2. **应用优先级规则**:`*` 的优先级高于 `+` 和 `>`。
* **计算 `2 * 3`**,得到 `6`。表达式变为 `3 + 4 > 6`。
3. **再次扫描表达式**:`3 + 4 > 6`
4. **应用优先级规则**:`+` 的优先级高于 `>`。
* **计算 `3 + 4`**,得到 `7`。表达式变为 `7 > 6`。
5. **最后一步**:执行关系运算 `7 > 6`。这个比较是成立的,所以结果是 `true`。
* 而在 `cout` 中直接输出 `bool` 值时,`true` 会显示为 `1`,`false` 会显示为 `0`。所以 `cout << (3 + 4 > 2 * 3);` 会输出 `1`。
#### 4. 代码实现
* **问题**:(书本 P33 例 3-1) 输入两个整数 `a` 和 `b`,判断并输出:
1. `a` 是否大于 `b`?
2. `a` 是否小于或等于 `b`?
3. `a` 是否不等于 `b`?
输出 3 个整数(1 代表真,0 代表假),用空格隔开。
* **完整代码**:
```cpp
#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. 验证与深化
* **常见问题 **
1. **最大的陷阱:`==` 和 `=` 的区别是什么?**
* `==` (两个等号) 是**关系运算符**,用来**判断**左右两边是否相等。它返回一个 `bool` 值。例如 `if (a == 5)` 是在问“a 等于 5 吗?”。
* `=` (一个等号) 是**赋值运算符**,用来把右边的值**赋给**左边的变量。例如 `a = 5;` 是在命令“让 a 的值变成 5”。
* **最常犯的错误**就是在需要判断的地方写了赋值,例如 ` a = 5`,这会导致逻辑错误且很难发现!**请务必牢记!**
2. **`y++` 所在的这行代码结束后,`y` 的值到底变了没有?**
* **绝对变了!** 后置运算符的“后”指的是在“使用”之后,但在整个语句结束之前,变量的值就已经更新了。只要记住口诀“先用旧值,再变新值”就不会错。
3. **任何数字都能转成 `bool` 类型吗?**
* 是的。C++ 有一个规则:**非零即为真**。
* 当一个整数或浮点数转换为 `bool` 类型时,只要它的值**不是 `0`**,就转为 `true`。只有 `0` 会转为 `false`。
* 例如:`(bool) -3` 的结果是 `true`,`(bool) 100` 的结果是 `true`,而 `(bool) 0` 的结果是 `false`。
---
#### 6. 总结与练习
* **要点回顾**
1. **算术运算符**:`+`, `-`, `*`, `/` (整除), `%` (取余)。
2. **自增/自减**:`++` 和 `--` 是 `+1` 和 `-1` 的简写。
3. **前置 vs 后置**:`++a` (先变后用),`a++` (先用后变)。
4. **`bool` 类型**:专门存储 `true` (1) 和 `false` (0) 的类型,是判断的基础。
5. **关系运算符**:`==`, `!=`, `>`, `<`, `>=`, `<=`,它们的结果都是 `bool` 类型。
6. **优先级**:先算术,后关系。括号优先级最高。
* **拓展思考**
我们已经学会了如何进行一次比较,比如 `a > b`。但如果我想判断“一个数 `x` 是否既大于 0 又小于 10”呢?这需要**两个**关系运算同时成立。要连接多个关系表达式,我们就需要学习下一讲的内容——**逻辑运算符** (`&&`, `||`, `!`)。它们是构建更复杂判断逻辑的桥梁。