比较运算符 #

一、比较运算符概述 #

比较运算符用于比较两个值,返回布尔类型结果。

二、相等比较 #

2.1 运算符 #

运算符 说明 示例
== 等于 a == b
!= 不等于 a != b

2.2 基本类型比较 #

rust
fn main() {
    let a = 5;
    let b = 5;
    let c = 10;
    
    println!("{} == {} : {}", a, b, a == b);   // true
    println!("{} == {} : {}", a, c, a == c);   // false
    println!("{} != {} : {}", a, b, a != b);   // false
    println!("{} != {} : {}", a, c, a != c);   // true
}

2.3 浮点数比较 #

rust
fn main() {
    let a = 0.1 + 0.2;
    let b = 0.3;
    
    println!("0.1 + 0.2 == 0.3 : {}", a == b);  // false(浮点精度问题)
    
    // 使用近似比较
    let epsilon = 1e-10;
    println!("近似相等: {}", (a - b).abs() < epsilon);
}

2.4 字符串比较 #

rust
fn main() {
    let s1 = "hello";
    let s2 = "hello";
    let s3 = "world";
    
    println!("{} == {} : {}", s1, s2, s1 == s2);  // true
    println!("{} == {} : {}", s1, s3, s1 == s3);  // false
    
    let s4 = String::from("hello");
    println!("{} == {} : {}", s1, s4, s1 == s4);  // true
}

三、大小比较 #

3.1 运算符 #

运算符 说明 示例
> 大于 a > b
< 小于 a < b
>= 大于等于 a >= b
<= 小于等于 a <= b

3.2 数值比较 #

rust
fn main() {
    let a = 5;
    let b = 10;
    
    println!("{} > {} : {}", a, b, a > b);    // false
    println!("{} < {} : {}", a, b, a < b);    // true
    println!("{} >= {} : {}", a, b, a >= b);  // false
    println!("{} <= {} : {}", a, b, a <= b);  // true
}

3.3 字符比较 #

rust
fn main() {
    let c1 = 'a';
    let c2 = 'z';
    let c3 = '中';
    
    println!("'a' < 'z' : {}", c1 < c2);  // true
    println!("'a' < '中' : {}", c1 < c3); // true(按Unicode码点比较)
}

3.4 字符串比较 #

rust
fn main() {
    let s1 = "apple";
    let s2 = "banana";
    let s3 = "apple";
    
    println!("{} < {} : {}", s1, s2, s1 < s2);  // true(字典序)
    println!("{} <= {} : {}", s1, s3, s1 <= s3);// true
}

四、比较 Trait #

4.1 PartialEq #

PartialEq trait 提供相等比较:

rust
#[derive(Debug, PartialEq)]
struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let p1 = Point { x: 1, y: 2 };
    let p2 = Point { x: 1, y: 2 };
    let p3 = Point { x: 1, y: 3 };
    
    println!("p1 == p2 : {}", p1 == p2);  // true
    println!("p1 == p3 : {}", p1 == p3);  // false
}

4.2 手动实现 PartialEq #

rust
#[derive(Debug)]
struct Person {
    name: String,
    age: u32,
}

impl PartialEq for Person {
    fn eq(&self, other: &Self) -> bool {
        self.name == other.name && self.age == other.age
    }
}

fn main() {
    let p1 = Person { name: String::from("Alice"), age: 30 };
    let p2 = Person { name: String::from("Alice"), age: 30 };
    let p3 = Person { name: String::from("Bob"), age: 30 };
    
    println!("p1 == p2 : {}", p1 == p2);  // true
    println!("p1 == p3 : {}", p1 == p3);  // false
}

4.3 PartialOrd 和 Ord #

PartialOrdOrd 提供大小比较:

rust
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct Score {
    value: u32,
}

fn main() {
    let s1 = Score { value: 100 };
    let s2 = Score { value: 90 };
    let s3 = Score { value: 100 };
    
    println!("s1 > s2 : {}", s1 > s2);    // true
    println!("s1 >= s3 : {}", s1 >= s3);  // true
}

五、链式比较 #

5.1 多条件比较 #

rust
fn main() {
    let x = 5;
    
    // 检查范围
    let in_range = x >= 1 && x <= 10;
    println!("{} 在 1-10 范围内: {}", x, in_range);
    
    // 多个条件
    let valid = x > 0 && x < 10 && x % 2 == 1;
    println!("{} 是有效的奇数: {}", x, valid);
}

六、特殊比较 #

6.1 Option 比较 #

rust
fn main() {
    let a = Some(5);
    let b = Some(5);
    let c = Some(10);
    let d: Option<i32> = None;
    
    println!("Some(5) == Some(5) : {}", a == b);  // true
    println!("Some(5) == Some(10) : {}", a == c); // false
    println!("Some(5) == None : {}", a == d);     // false
}

6.2 Result 比较 #

rust
fn main() {
    let a: Result<i32, &str> = Ok(5);
    let b: Result<i32, &str> = Ok(5);
    let c: Result<i32, &str> = Err("error");
    
    println!("Ok(5) == Ok(5) : {}", a == b);  // true
    println!("Ok(5) == Err : {}", a == c);    // false
}

6.3 Vec 比较 #

rust
fn main() {
    let v1 = vec![1, 2, 3];
    let v2 = vec![1, 2, 3];
    let v3 = vec![1, 2, 4];
    
    println!("v1 == v2 : {}", v1 == v2);  // true
    println!("v1 == v3 : {}", v1 == v3);  // false
    println!("v1 < v3 : {}", v1 < v3);    // true
}

七、实践示例 #

7.1 查找最大最小值 #

rust
fn find_min_max(numbers: &[i32]) -> (i32, i32) {
    let mut min = numbers[0];
    let mut max = numbers[0];
    
    for &num in numbers {
        if num < min {
            min = num;
        }
        if num > max {
            max = num;
        }
    }
    
    (min, max)
}

fn main() {
    let numbers = vec![3, 1, 4, 1, 5, 9, 2, 6];
    let (min, max) = find_min_max(&numbers);
    
    println!("最小值: {}, 最大值: {}", min, max);
}

7.2 排序 #

rust
fn main() {
    let mut numbers = vec![3, 1, 4, 1, 5, 9, 2, 6];
    
    numbers.sort();
    println!("升序: {:?}", numbers);
    
    numbers.sort_by(|a, b| b.cmp(a));
    println!("降序: {:?}", numbers);
}

7.3 二分查找 #

rust
fn binary_search(arr: &[i32], target: i32) -> Option<usize> {
    let mut left = 0;
    let mut right = arr.len();
    
    while left < right {
        let mid = left + (right - left) / 2;
        
        if arr[mid] == target {
            return Some(mid);
        } else if arr[mid] < target {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    
    None
}

fn main() {
    let arr = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];
    
    match binary_search(&arr, 5) {
        Some(index) => println!("找到,索引: {}", index),
        None => println!("未找到"),
    }
}

八、总结 #

本章学习了:

  • 相等比较运算符 ==!=
  • 大小比较运算符 > < >= <=
  • PartialEq 和 PartialOrd trait
  • 自定义类型的比较实现
  • 各种类型的比较示例

下一章,我们将学习逻辑运算符。

最后更新:2026-03-27