← 目录 / 第四章 · 分支结构 / 4.3 三元运算符

4.3 条件表达式(三元运算符)

三元运算符是 if-else 的简洁写法,适合简单的二选一赋值场景,一行搞定。它是 C++ 里唯一一个需要三个操作数的运算符,因此得名"三元"。

条件表达式(三元运算符)

三元运算符是 if-else 的简洁写法,适合简单的二选一赋值场景,一行搞定。

4.3.1 基本用法

条件 ? 值1(true时返回) : 值2(false时返回)
条件为 true → 返回值1 条件为 false → 返回值2

关键要理解的一点是:条件 ? 值1 : 值2 这一整坨本身就是一个表达式,它会计算出一个值(值1或值2),这个值可以直接赋给变量、直接输出,或者作为另一个表达式的一部分——这和 if-else 是"语句"(只能执行动作,不能作为值使用)有本质区别。

C++ · 三元运算符示例
1int a = 10, b = 20;
2
3int maxVal = (a > b) ? a : b; // maxVal = 20
4cout << "较大值是:" << maxVal << endl;
5
6// 等价的 if-else 写法(更长)
7int maxVal2;
8if (a > b) maxVal2 = a;
9else maxVal2 = b;

正因为三元运算符是一个"表达式"而不是"语句",它还可以直接嵌在 cout 里,不需要先存进一个变量:

C++ · 直接用在 cout 里
1int score = 78;
2cout << (score >= 60 ? "及格" : "不及格") << endl;

4.3.2 嵌套三元运算符

三元运算符的"值"部分本身还可以再嵌一层三元运算符,用来表达多重条件——但这已经开始牺牲可读性了,仅作了解:

C++ · 嵌套三元运算符(多重判断)
1int score = 78;
2string grade = score >= 90 ? "优秀" :
3 score >= 75 ? "良好" :
4 score >= 60 ? "及格" : "不及格";
5// 等价于 4.2 节的 if-else if-else 链,但可读性明显更差
⚠️
能读懂不代表该这么写:这段嵌套三元表达式和 4.2 节的多分支 if-else if-else 逻辑完全等价,但阅读起来明显吃力得多——每多嵌一层,理解难度都会显著上升。这就是为什么三元运算符只推荐用于简单的二选一场景,一旦涉及三个以上的分支,if-else if-elseswitch 才是更合适的选择。

4.3.3 常见陷阱与易错点

把本节内容汇总成几条最容易踩坑的规则:

1
滥用嵌套导致可读性差:嵌套三元运算符能实现的逻辑,用 if-else if-else 几乎总能写得更清楚。三元运算符的价值在于"简洁",一旦开始嵌套,这个优势就荡然无存了。
2
忘记给整个三元表达式加括号:三元运算符的优先级比大多数运算符都低,混在复杂表达式里如果不加括号,容易和其他运算符结合出乎意料的结果。养成给整个 (条件 ? 值1 : 值2) 加括号的习惯,尤其是像 cout << (...) 这样嵌入更大表达式的场景。
3
两个分支的类型不一致:三元运算符要求"值1"和"值2"的类型能统一成同一种类型,比如一个是 int 一个是 double,编译器会把结果统一转换成 double(见 2.1 节隐式转换),这有时会产生不易察觉的精度变化。如果两个分支类型差异较大(比如一个是数字一个是字符串),可能直接编译报错。