信奥崔老师:关系运算 (Relational Operations)

40 阅读4分钟

[等级1] 关系运算 (Relational Operations)

图片

1. 概念介绍

关系运算,也称为比较运算,用于比较两个值的大小关系。其结果是一个布尔值(true 或 false)。

  • 大于 (>) : 左操作数是否大于右操作数。
  • 大于等于 (>=) : 左操作数是否大于或等于右操作数。
  • 小于 (<) : 左操作数是否小于右操作数。
  • 小于等于 (<=) : 左操作数是否小于或等于右操作数。
  • 等于 (==) : 两操作数是否相等。注意是两个等号,一个等号是赋值。
  • 不等于 (!=) : 两操作数是否不相等。

2. 算法步骤

  1. 取运算符左右两边的操作数。
  2. 根据指定的比较规则(如>==等)进行比较。
  3. 返回比较结果,true(通常在C++中表示为1)或 false(表示为0)。

3. 算法可视化SVG图示

下图展示了关系运算的流程,输入两个值,通过比较器,输出一个布尔结果。

图片

4. 核心特性

  • 返回布尔值: 结果总是truefalse
  • 用于控制流: 关系运算是 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 语句中决定执行哪个代码块。
  • 循环控制: 在 forwhiledo-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