4.5 [等级1] 三目运算 (Ternary Operator)
1. 概念介绍

三目运算符,也叫条件运算符,是 C++ 中唯一一个需要三个操作数的运算符。它是一种紧凑的 if-else 语句的替代形式,用于根据一个条件选择两个值中的一个。 语法格式为:condition ? expression_if_true : expression_if_false
condition: 一个布尔表达式。expression_if_true: 如果condition为true,整个表达式的值就是这个部分的值。expression_if_false: 如果condition为false,整个表达式的值就是这个部分的值。
2. 算法步骤
- 计算
condition表达式。 - 如果
condition的结果为true(或非零),则计算expression_if_true,并将其结果作为整个三目运算表达式的结果。 - 如果
condition的结果为false(或零),则计算expression_if_false,并将其结果作为整个三目运算表达式的结果。注意 :expression_if_true和expression_if_false中只有一个会被执行。
3. 算法可视化SVG图示
下图展示了三目运算的决策流程,像一个铁路岔道。

4. 核心特性
- 简洁性 : 是
if-else的紧凑写法。 - 表达式 : 三目运算本身是一个表达式,它有返回值,可以被赋值给变量,或用在其他表达式中。而
if-else是语句,没有返回值。 - 类型兼容 :
expression_if_true和expression_if_false的类型应该相同或可以隐式转换为一个共同的类型。 - 右结合性 : 三目运算符是右结合的,
a ? b : c ? d : e等价于a ? b : (c ? d : e)。
5. C++代码基础实现
c
#include <iostream>
#include <string>
int main() {
int a = 10, b = 20;
// 示例1: 求两数中的最大值
int max_val = (a > b) ? a : b;
std::cout << "Max value is: " << max_val << std::endl; // 输出 20
// 示例2: 判断奇偶性
int num = 7;
std::string result = (num % 2 == 0) ? "Even" : "Odd";
std::cout << num << " is " << result << std::endl; // 输出 7 is Odd
// 示例3: 直接在输出中使用
int score = 85;
std::cout << "Grade: " << (score >= 60 ? "Pass" : "Fail") << std::endl; // 输出 Grade: Pass
return 0;
}
6. 优化策略
- 可读性优先 : 不要过度使用三目运算符。如果逻辑非常复杂或嵌套多层,使用
if-else结构会更清晰。 - 避免副作用 : 尽量不要在三目运算符的第二和第三部分使用有副作用的表达式(如
++i),这可能使代码难以理解。例如int x = a > b ? c++ : d++;
7. 优缺点
- 优点:
-
- 代码紧凑: 对于简单的条件赋值,可以显著减少代码行数。
- 是表达式 : 可以方便地嵌入到其他表达式中,如函数调用
printf("%s", score > 60 ? "Pass" : "Fail");或变量初始化。
- 缺点:
-
- 可读性差: 嵌套的三目运算会变得非常难以阅读和维护。
- 调试困难 : 在三目运算符的表达式中设置断点比在
if-else块中更难。
8. 应用场景
- 简单的条件赋值 :
int max = a > b ? a : b; - 初始化
const变量 :const int val = (some_condition) ? 100 : 200;这种情况if-else无法做到。 - 返回语句 :
return x > 0 ? x : -x;(求绝对值)。 - 输出格式化: 根据条件选择不同的输出字符串。
9. 扩展
constexpr if(C++17) : 对于模板编程,if constexpr允许在编译时根据条件进行分支,不满足条件的分支代码甚至不会被编译,这比运行时三目运算更强大。- 与
lambda结合 :auto my_func = (use_new_version) ? [](int x){...} : [](int x){...};
10. 课后配套练习及答案
练习1: 求绝对值输入一个整数,使用三目运算符输出其绝对值。
c
// 答案
#include <iostream>
int main() {
int n;
std::cin >> n;
int abs_n = (n >= 0) ? n : -n;
std::cout << "Absolute value: " << abs_n << std::endl;
return 0;
}
练习2: 两数中的较小者输入两个整数,使用三目运算符输出较小的一个。
c
// 答案
#include <iostream>
int main() {
int a, b;
std::cin >> a >> b;
int min_val = (a < b) ? a : b;
std::cout << "Min value: " << min_val << std::endl;
return 0;
}
练习3: 性别显示输入一个字符 'M' 或 'F',使用三目运算符输出 "Male" 或 "Female"。
c
// 答案
#include <iostream>
#include <string>
int main() {
char gender;
std::cin >> gender;
std::string gender_str = (gender == 'M') ? "Male" : "Female";
std::cout << gender_str << std::endl;
return 0;
}
练习4: 打折计算 商品价格 price。如果 price 大于等于100,则打9折;否则不打折。使用三目运算符计算并输出最终价格。
c
// 答案
#include <iostream>
#include <iomanip>
int main() {
double price;
std::cin >> price;
double final_price = (price >= 100) ? price * 0.9 : price;
std::cout << "Final price: " << std::fixed << std::setprecision(2) << final_price << std::endl;
return 0;
}
练习5: 嵌套三目运算输入一个整数,判断它是正数、负数还是零,并输出 "Positive", "Negative" 或 "Zero"。
c
// 答案
#include <iostream>
#include <string>
int main() {
int n;
std::cin >> n;
std::string result = (n > 0) ? "Positive" : ((n < 0) ? "Negative" : "Zero");
std::cout << result << std::endl;
return 0;
}
11. 相关网络资源推荐
- Conditional operator - cppreference.com
- C++ Ternary Operator - Programiz