[等级1] 关系运算 (Relational Operations)
1. 概念介绍
关系运算,也称为比较运算,用于比较两个值的大小关系。其结果是一个布尔值(true 或 false)。
- 大于 (
>) : 左操作数是否大于右操作数。 - 大于等于 (
>=) : 左操作数是否大于或等于右操作数。 - 小于 (
<) : 左操作数是否小于右操作数。 - 小于等于 (
<=) : 左操作数是否小于或等于右操作数。 - 等于 (
==) : 两操作数是否相等。注意是两个等号,一个等号是赋值。 - 不等于 (
!=) : 两操作数是否不相等。
2. 算法步骤
- 取运算符左右两边的操作数。
- 根据指定的比较规则(如
>、==等)进行比较。 - 返回比较结果,
true(通常在C++中表示为1)或false(表示为0)。
3. 算法可视化SVG图示
下图展示了关系运算的流程,输入两个值,通过比较器,输出一个布尔结果。
4. 核心特性
- 返回布尔值: 结果总是
true或false。 - 用于控制流: 关系运算是
if语句、while循环等条件判断的核心。 - 可重载: 在C++中,可以为自定义类重载这些运算符,以定义对象的比较逻辑。
- 浮点数比较陷阱: 由于精度问题,直接使用
==比较两个浮点数是否相等是危险的。通常需要检查它们的差的绝对值是否小于一个极小的数(epsilon)。
5. C++代码基础实现
#include <iostream>
int main() {
int a = 10, b = 5, c = 10;
std::cout << std::boolalpha; // 让输出显示 "true" 或 "false" 而不是 1 或 0
std::cout << "a > b: " << (a > b) << std::endl; // true
std::cout << "a < b: " << (a < b) << std::endl; // false
std::cout << "a == c: " << (a == c) << std::endl; // true
std::cout << "a != b: " << (a != b) << std::endl; // true
std::cout << "a >= c: " << (a >= c) << std::endl; // true
std::cout << "b <= c: " << (b <= c) << std::endl; // true
return 0;
}
6. 优化策略
-
整数比较: 整数比较速度极快,无需特别优化。
-
避免复杂比较: 如果可以,将复杂的对象比较转换为简单的整数或字符串比较。
-
浮点数比较优化:
#include <cmath> const double EPS = 1e-9; // 定义一个极小值 double x = 0.1 + 0.2; double y = 0.3; if (std::abs(x - y) < EPS) { // 认为 x 和 y 相等 }
7. 优缺点
- 优点: 逻辑清晰,是程序做出决策的基础。
- 缺点: 容易混淆赋值
=和等于==,导致逻辑错误。浮点数比较问题是常见的 bug 来源。
8. 应用场景
- 条件判断: 在
if-else语句中决定执行哪个代码块。 - 循环控制: 在
for,while,do-while循环中决定循环是否继续。 - 排序算法: 如冒泡排序、快速排序等,都需要比较元素的大小。
- 搜索算法: 如二分搜索,需要比较目标值与中间值的大小。
9. 扩展
- 三向比较运算符 (
<=>) : C++20 引入,被称为“宇宙飞船运算符”。a <=> b会返回一个对象,该对象可以与0比较,若a < b则结果小于0,若a > b则结果大于0,若a == b则结果等于0。这可以一次性获得完整的比较信息。 - 字符串比较: 字符串(
std::string)可以直接使用关系运算符进行比较,其规则是按字典序比较。
10. 课后配套练习及答案
练习1: 判断正负零输入一个整数,判断它是正数、负数还是零。
// 答案
#include <iostream>
int main() {
int n;
std::cin >> n;
if (n > 0) {
std::cout << "Positive" << std::endl;
} else if (n < 0) {
std::cout << "Negative" << std::endl;
} else {
std::cout << "Zero" << std::endl;
}
return 0;
}
练习2: 两数中的较大者输入两个整数,输出其中较大的一个。
// 答案
#include <iostream>
int main() {
int a, b;
std::cin >> a >> b;
if (a >= b) {
std::cout << a << std::endl;
} else {
std::cout << b << std::endl;
}
return 0;
}
练习3: 判断奇偶数输入一个整数,判断它是奇数还是偶数。
// 答案
#include <iostream>
int main() {
int n;
std::cin >> n;
if (n % 2 == 0) {
std::cout << "Even" << std::endl;
} else {
std::cout << "Odd" << std::endl;
}
return 0;
}
练习4: 判断闰年输入一个年份,判断它是否是闰年(能被4整除但不能被100整除,或者能被400整除)。
// 答案
#include <iostream>
int main() {
int year;
std::cin >> year;
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
std::cout << "Leap year" << std::endl;
} else {
std::cout << "Common year" << std::endl;
}
return 0;
}
练习5: 判断考试成绩等级输入一个0-100的整数成绩,>=90为'A',>=80为'B',>=70为'C',>=60为'D',其余为'E'。
// 答案
#include <iostream>
int main() {
int score;
std::cin >> score;
if (score >= 90) {
std::cout << 'A' << std::endl;
} else if (score >= 80) {
std::cout << 'B' << std::endl;
} else if (score >= 70) {
std::cout << 'C' << std::endl;
} else if (score >= 60) {
std::cout << 'D' << std::endl;
} else {
std::cout << 'E' << std::endl;
}
return 0;
}
11. 相关网络资源推荐
- C++ 关系和比较运算符 - cppreference.com
- C++ Relational Operators - GeeksforGeeks