📄 一句话概括
3.1~3.2 把零件(运算符)备齐了,本节开始组装:运算符 + 操作数 = 表达式。表达式算完必有一个值 + 一个类型——这是理解后面"类型转换""左值右值"的总纲。
一、给"表达式"正式下定义
表达式(expression):由运算符和操作数组成的、能算出一个值的式子。
| 形态 | 例子 | 值 | 类型 |
|---|---|---|---|
| 字面量 | 42 |
42 | int |
| 变量 | x |
x 里的数 | x 的类型 |
| 算式 | a + b * 2 |
算出来的数 | 由类型转换规则定(3.3.2) |
| 比较 | a > b |
真/假 | bool |
| 赋值 | a = 5 |
5(顺便装盒) | a 的类型 |
| 三目 | n % 2 ? "奇" : "偶" |
选中的那个 | 同选中者 |
注意两个"惊喜":单个变量是表达式(最短的表达式)、赋值也是表达式(有值——连等号的原理,3.1.4 埋过)。
二、一个比方:应用题与答案的单位
表达式像一道应用题:
- 有过程——按优先级一步步算(3.2)
- 有答案——最终值
- 答案有单位——类型(是 int 还是 double 还是 bool)
"答案有单位"这件事决定了:值能存进什么样的盒子、能参与什么后续运算。类型不匹配的转换规则,就是 3.3.2 的全部内容;"值能不能被赋值",就是 3.4 左值右值的问题。
三、本节三篇的分工
- 3.3.1 认识表达式:表达式和语句的区别——分号前后的世界
- 3.3.2 类型转换:表达式里类型不一致时谁让谁、怎么变(含实例04/05)
- 3.4 左值右值:哪些表达式能当"= 的左边"
四、30 秒实验
#include <iostream>
using namespace std;
int main() {
int a = 3, b = 4;
cout << (a + b) << endl; // 7 —— 算式表达式
cout << (a > b) << endl; // 0 —— 比较表达式(bool)
cout << (a = 99) << endl; // 99 —— 赋值表达式,值就是装进去的 99
cout << a << endl; // 99 —— 顺便 a 真的变了
cout << sizeof(a + 1.5) << endl; // 8 —— 表达式的类型是 double
return 0;
}
看到什么算成功:7 0 99 99 8。重点两行:a = 99 作为表达式有值(99),且有副作用(a 被改);a + 1.5 的类型自动升级成 double(3.3.2 的预告)。
五、常见误区
- "表达式必须是'完整的算式'"——单个
42、单个x都算表达式。有值有类型就是表达式。 - "赋值是语句不是表达式"——赋值有值,所以是表达式;加个分号才成语句。这条认知直接解释连等号。
- "表达式的类型无所谓"——类型决定它的值能塞哪、怎么算。
(a > b) + 1能算(bool 当 0/1),但通常说明你想错了。
自测三问(点开对答案)
1. 表达式算完必有哪两样东西?——一个**值**和一个**类型**。 2. `x = 5` 作为表达式的值和类型?——值 5,类型同 x。 3. 最短的表达式长什么样?——单个字面量或变量,如 `42`、`x`。- ☐ 3.3.1 认识表达式(下一节)
相关笔记
- 结合性和优先级 —— 表达式的"过程"规则
- 赋值运算符 —— "赋值有值"的伏笔
- 🔷 C++基础 · 索引 —— 全课路线图