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

条件运算符 ? : 是 C++ 唯一的三目运算符(要三个操作数):条件 ? 甲 : 乙——条件真取甲、假取乙。它是"二选一带回一个值"的紧凑写法,第 4 章 if-else 的单行替身。

一、三个位置各放什么

条件 ? 甲 : 乙
 ↑     ↑   ↑
①问真假 ②真取我 ③假取我

执行顺序:先算①的条件(真假),真→只算甲并把甲的值当整个式子的值;假→只算乙。另一边根本不算(和 && \|\| 的短路一个道理)。

int a = 10, b = 7;
int max = (a > b) ? a : b;    // a > b 真 → 整个式子的值是 a → max = 10

读法训练:"a 大吗?大就取 a,否则取 b。" 三段依次读,和读句子一样。

二、它的最大特点:整个式子是"一个值"

if-else 是语句(做动作,没有值);条件运算符是表达式(算完就是一个值)。所以它能塞到任何需要值的地方:

// 1. 塞进赋值
int max = (a > b) ? a : b;

// 2. 塞进 cout
cout << (n % 2 == 0 ? "偶数" : "奇数") << endl;

// 3. 塞进另一个表达式
int total = base + (vip ? 20 : 0);   // VIP 加 20 分

第 3 个例子最能体现价值:"根据情况给不同的加数",用 if-else 要写四五行、用 ? : 一行。

注意括号:<< 优先级高于 ? :,cout << n % 2 == 0 ? "偶" : "奇" 会被错误拆解——三目表达式整体套括号是铁习惯。

三、什么时候用它,什么时候用 if-else?

场景 选谁
二选一,只是挑一个值(选大、选标签、加不加成) ? : 一行利落
两条路各自要做多个动作 if-else(? : 塞不下)
需要再分支(三路以上) if-else if 或后续的 switch

原则:? : 里只放"值",别放"一堆动作"。 a > b ? (做三件事) : (做另三件事) 这种嵌套写法可读性崩坏,见了要皱眉。

四、动手 Demo:三连判

#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 7, n = 15;

    cout << "较大值:" << ((a > b) ? a : b) << endl;        // 10
    cout << n << "是" << (n % 2 == 0 ? "偶数" : "奇数") << endl;  // 奇数
    int score = 59;
    cout << (score >= 60 ? "及格" : "不及格") << endl;       // 不及格

    // 嵌套(能看懂即可,别常写)
    int x = -8;
    cout << (x > 0 ? "正" : (x < 0 ? "负" : "零")) << endl;  // 负
    return 0;
}

看到什么算成功:10 / 奇数 / 不及格 / 负。嵌套那个从外层往里读:先判正,不是正才进里层判负。

30 秒实验:把 n 改成 16、score 改成 60——注意 60 走的是"及格"分支(>= 含等于,3.1.2 的边界)。再故意去掉三目外层的括号,看编译器报什么。

五、常见误区

  1. "? : 和 if-else 完全等价"——选值等价,但一个是表达式(有值)、一个是语句。要"带回一个值"时只能用 ? :。
  2. "条件不用加括号"——不加经常被优先级坑(<<、+ 都比 ? : 高)。整体括号,永远。
  3. "嵌套越多越显功力"——正好相反。两三层是可读性极限,再多就老老实实 if-else。
  4. "甲乙必须同类型"——严格说两支会做类型统一(3.3.2 的转换规则),n > 0 ? 1 : 0.5 能编译,但结果类型是 double。类型不一致时留个心眼。
自测四问(点开对答案) 1. `5 > 3 ? 10 : 20` 的值?——`10`(条件真)。 2. 条件运算符有几个操作数?叫什么?——3 个,三目运算符(C++ 唯一)。 3. `n % 2 ? "奇" : "偶"` 能这样写吗?——能,`n % 2` 非 0 即真(余 1 奇),0 即假(余 0 偶)。 4. 为什么 `cout << (x ? "A" : "B")` 必须加括号?——`<<` 优先级高于 `? :`,不加括号会先做输出、把式子拆坏。

相关笔记