逻辑运算符 #

一、逻辑运算符概述 #

逻辑运算符用于布尔值的逻辑运算,返回布尔结果。

二、基本逻辑运算符 #

2.1 运算符列表 #

运算符 说明 示例
&& 逻辑与 a && b
|| 逻辑或 a || b
! 逻辑非 !a

2.2 逻辑与 (&&) #

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

2.3 逻辑或 (||) #

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

2.4 逻辑非 (!) #

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

三、短路求值 #

3.1 概念 #

短路求值是指:

  • &&:如果左边为 false,不计算右边
  • ||:如果左边为 true,不计算右边

3.2 短路与示例 #

rust
fn main() {
    let a = false;
    
    // 右边不会执行
    let result = a && expensive_operation();
    println!("结果: {}", result);
}

fn expensive_operation() -> bool {
    println!("执行耗时操作");
    true
}

3.3 短路或示例 #

rust
fn main() {
    let a = true;
    
    // 右边不会执行
    let result = a || expensive_operation();
    println!("结果: {}", result);
}

fn expensive_operation() -> bool {
    println!("执行耗时操作");
    false
}

3.4 利用短路求值 #

rust
fn main() {
    let num = Some(5);
    
    // 安全地检查值
    if num.is_some() && num.unwrap() > 0 {
        println!("正数");
    }
    
    // 提供默认值
    let value = num.unwrap_or(0);
    println!("值: {}", value);
}

四、运算符优先级 #

4.1 优先级规则 #

从高到低:

  1. !(非)
  2. &&(与)
  3. ||(或)
rust
fn main() {
    let a = true;
    let b = false;
    let c = true;
    
    // ! 优先级最高
    let result = !a && b;
    println!("!true && false = {}", result);  // false
    
    // && 优先级高于 ||
    let result = a || b && c;
    println!("true || false && true = {}", result);  // true
    
    // 使用括号明确优先级
    let result = (a || b) && c;
    println!("(true || false) && true = {}", result);  // true
}

五、条件表达式 #

5.1 if 条件 #

rust
fn main() {
    let age = 25;
    let has_id = true;
    
    if age >= 18 && has_id {
        println!("可以进入");
    } else {
        println!("不能进入");
    }
}

5.2 复杂条件 #

rust
fn main() {
    let age = 25;
    let is_member = true;
    let has_coupon = false;
    
    // 复杂条件组合
    let can_enter = age >= 18 && (is_member || has_coupon);
    
    if can_enter {
        println!("可以享受优惠");
    }
}

5.3 多条件判断 #

rust
fn main() {
    let score = 85;
    
    if score >= 90 {
        println!("优秀");
    } else if score >= 80 {
        println!("良好");
    } else if score >= 60 {
        println!("及格");
    } else {
        println!("不及格");
    }
}

六、布尔表达式 #

6.1 比较表达式 #

rust
fn main() {
    let x = 5;
    let y = 10;
    
    let is_greater = x > y;
    let is_equal = x == y;
    let is_less_or_equal = x <= y;
    
    println!("x > y: {}", is_greater);
    println!("x == y: {}", is_equal);
    println!("x <= y: {}", is_less_or_equal);
}

6.2 方法返回布尔值 #

rust
fn main() {
    let s = String::from("hello");
    
    // 字符串方法返回布尔值
    println!("是否为空: {}", s.is_empty());
    println!("是否以 'h' 开头: {}", s.starts_with('h'));
    println!("是否包含 'ell': {}", s.contains("ell"));
    
    let num = 42;
    println!("是否为偶数: {}", num % 2 == 0);
    println!("是否为正数: {}", num > 0);
}

七、实践示例 #

7.1 用户验证 #

rust
fn validate_user(username: &str, password: &str, age: u32) -> bool {
    let valid_username = username.len() >= 3 && username.len() <= 20;
    let valid_password = password.len() >= 8;
    let valid_age = age >= 18 && age <= 120;
    
    valid_username && valid_password && valid_age
}

fn main() {
    let result = validate_user("alice", "password123", 25);
    println!("验证结果: {}", result);
    
    let result = validate_user("ab", "123", 15);
    println!("验证结果: {}", result);
}

7.2 权限检查 #

rust
struct User {
    is_admin: bool,
    is_active: bool,
    has_permission: bool,
}

fn can_access(user: &User) -> bool {
    user.is_active && (user.is_admin || user.has_permission)
}

fn main() {
    let admin = User {
        is_admin: true,
        is_active: true,
        has_permission: false,
    };
    
    let normal_user = User {
        is_admin: false,
        is_active: true,
        has_permission: true,
    };
    
    let inactive = User {
        is_admin: true,
        is_active: false,
        has_permission: true,
    };
    
    println!("管理员可访问: {}", can_access(&admin));
    println!("普通用户可访问: {}", can_access(&normal_user));
    println!("非活跃用户可访问: {}", can_access(&inactive));
}

7.3 输入验证 #

rust
fn validate_input(input: &str) -> Result<(), String> {
    if input.is_empty() {
        return Err("输入不能为空".to_string());
    }
    
    if input.len() < 3 || input.len() > 50 {
        return Err("长度必须在3-50之间".to_string());
    }
    
    if !input.chars().all(|c| c.is_alphanumeric() || c == '_') {
        return Err("只能包含字母、数字和下划线".to_string());
    }
    
    Ok(())
}

fn main() {
    let inputs = vec!["valid_name", "ab", "", "invalid!"];
    
    for input in inputs {
        match validate_input(input) {
            Ok(()) => println!("'{}' 验证通过", input),
            Err(e) => println!("'{}' 验证失败: {}", input, e),
        }
    }
}

八、位运算中的逻辑 #

8.1 位与 (&) #

rust
fn main() {
    let a = 0b1010;
    let b = 0b1100;
    
    println!("{:04b} & {:04b} = {:04b}", a, b, a & b);  // 1000
}

8.2 位或 (|) #

rust
fn main() {
    let a = 0b1010;
    let b = 0b1100;
    
    println!("{:04b} | {:04b} = {:04b}", a, b, a | b);  // 1110
}

8.3 位异或 (^) #

rust
fn main() {
    let a = 0b1010;
    let b = 0b1100;
    
    println!("{:04b} ^ {:04b} = {:04b}", a, b, a ^ b);  // 0110
}

九、总结 #

本章学习了:

  • 逻辑与 &&、逻辑或 ||、逻辑非 !
  • 短路求值机制
  • 运算符优先级
  • 条件表达式
  • 布尔表达式
  • 实际应用示例

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

最后更新:2026-03-27