逻辑运算符 #
一、逻辑运算符概述 #
逻辑运算符用于布尔值的逻辑运算,返回布尔结果。
二、基本逻辑运算符 #
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 优先级规则 #
从高到低:
!(非)&&(与)||(或)
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