🔷 第三章 运算符与表达式
📄 一句话概括

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.3.2 的全部内容;"值能不能被赋值",就是 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 的预告)。

五、常见误区

  1. "表达式必须是'完整的算式'"——单个 42、单个 x 都算表达式。有值有类型就是表达式。
  2. "赋值是语句不是表达式"——赋值有值,所以是表达式;加个分号才成语句。这条认知直接解释连等号。
  3. "表达式的类型无所谓"——类型决定它的值能塞哪、怎么算。(a > b) + 1 能算(bool 当 0/1),但通常说明你想错了。
自测三问(点开对答案) 1. 表达式算完必有哪两样东西?——一个**值**和一个**类型**。 2. `x = 5` 作为表达式的值和类型?——值 5,类型同 x。 3. 最短的表达式长什么样?——单个字面量或变量,如 `42`、`x`。

相关笔记