跳转到内容

Rust 运算符

运算符(operator)是用来做数学运算、比较值和组合条件的符号。如果你用过任何一门类 C 语言,这里的大部分内容都会很眼熟。

fn main() {
let a = 10;
let b = 3;
println!("{}", a + b); // 13
println!("{}", a - b); // 7
println!("{}", a * b); // 30
println!("{}", a / b); // 3(整数除法,丢掉余数)
println!("{}", a % b); // 1(余数)
}
▶ 动手试一试

比较运算符比较两个值,返回一个 bool:

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

你会在 if 条件里经常用到它们,If…Else 一页会讲到。

逻辑运算符用来组合布尔值,或者把它取反:

fn main() {
let is_logged_in = true;
let is_admin = false;
println!("{}", is_logged_in && is_admin); // false:两边都必须为 true
println!("{}", is_logged_in || is_admin); // true:至少有一边为 true
println!("{}", !is_admin); // true:把 false 变成 true
}
▶ 动手试一试
  • &&:与(and),只有两边都为 true 时才为 true。
  • ||:或(or),至少有一边为 true 时就为 true。
  • !:非(not),把 true 变成 false,反之亦然。

除了普通的 =,Rust 还有一些简写运算符,可以根据变量的当前值来更新它:

fn main() {
let mut score = 10;
score += 5; // 等同于:score = score + 5
score -= 2; // score = score - 2
score *= 3; // score = score * 3
score /= 2; // score = score / 2
println!("{score}");
}
▶ 动手试一试

记住,变量必须用 mut 声明,这些写法才能编译通过,因为你在修改它的值。

当一个表达式里有好几个运算符时,Rust 并不是简单地从左到右计算。和学校里的数学一样,*、/ 和 % 先于 + 和 - 计算。同一级别的运算符从左到右计算。括号永远最先算,所以想换一种顺序时,就加上括号。

fn main() {
let a = 2 + 3 * 4; // 先算 *:2 + 12
let b = (2 + 3) * 4; // 先算括号:5 * 4
let c = 10 - 4 - 3; // 同一级别,从左到右:(10 - 4) - 3
let d = 17 % 5 * 2; // 同一级别,从左到右:(17 % 5) * 2
let ok = 1 + 1 == 2 && 3 > 2; // 先算术,再比较,最后 &&
println!("{a} {b} {c} {d} {ok}");
}

输出:

14 20 3 4 true
▶ 动手试一试

完整的顺序从先到后大致是:算术(先 * / %,再 + -),然后是比较(== != < > <= >=),接着是 &&,再是 ||,最后是赋值运算符(= += -= 等)。所以 1 + 1 == 2 && 3 > 2 不加任何括号也能正常工作。不过,如果你得停下来想一想顺序,那就加上括号。括号不花任何代价,还能让代码更好读。

一段视频长 125 秒。把它存进一个变量,然后打印出它是几分几秒,比如 2 分 5 秒。提示:整数除法 / 得到整分钟数,% 得到剩下的秒数。

查看答案
fn main() {
let total_seconds = 125;
let minutes = total_seconds / 60; // 2(余数被丢掉)
let seconds = total_seconds % 60; // 5(余数)
println!("{minutes} 分 {seconds} 秒");
}

输出:

2 分 5 秒
▶ 动手试一试

游戏的 score 从 10 开始。用简写赋值运算符给它加 25、减 5,再乘以 2。打印分数、分数是否至少为 50,以及分数是否至少为 50 并且是偶数。提示:当 score % 2 == 0 时,这个数就是偶数。

查看答案
fn main() {
let mut score = 10;
score += 25; // 35
score -= 5; // 30
score *= 2; // 60
println!("分数:{score}");
println!("过关了吗?{}", score >= 50);
println!("过关且是偶数吗?{}", score >= 50 && score % 2 == 0);
}

输出:

分数:60
过关了吗?true
过关且是偶数吗?true
▶ 动手试一试
  • 算术:+ - * / %。整数除法会截断,没有小数。
  • 比较:== != < > <= >=,都返回 bool。
  • 逻辑:&&(与)、||(或)、!(非)。
  • 赋值简写:+= -= *= /= 直接更新一个 mut 变量。Rust 没有 ++。
  • * / % 先于 + - 计算,算术先于比较和 &&/||。拿不准时就加括号。

小测验

1. 当两边都是整数时,10 / 3 的结果是多少?

2. == 和 < 这样的比较运算符总是返回什么类型?

3. score += 5; 要能编译通过,需要满足什么条件?

得分: 0 / 3