📄 一句话概括
条件运算符 ? : 是 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 的边界)。再故意去掉三目外层的括号,看编译器报什么。
五、常见误区
- "
? :和 if-else 完全等价"——选值等价,但一个是表达式(有值)、一个是语句。要"带回一个值"时只能用? :。 - "条件不用加括号"——不加经常被优先级坑(
<<、+都比? :高)。整体括号,永远。 - "嵌套越多越显功力"——正好相反。两三层是可读性极限,再多就老老实实 if-else。
- "甲乙必须同类型"——严格说两支会做类型统一(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")` 必须加括号?——`<<` 优先级高于 `? :`,不加括号会先做输出、把式子拆坏。- ☐ 3.1.9 逗号运算符(下一节)