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 声明,这些写法才能编译通过,因为你在修改它的值。
运算顺序(优先级)
Section titled “运算顺序(优先级)”当一个表达式里有好几个运算符时,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 不加任何括号也能正常工作。不过,如果你得停下来想一想顺序,那就加上括号。括号不花任何代价,还能让代码更好读。
1. 分钟和秒
Section titled “1. 分钟和秒”一段视频长 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
- 附录 B:运算符与符号 —《Rust 程序设计语言》:一页表格列出 Rust 的所有运算符及其作用。
- 字面量和运算符 —《通过例子学 Rust》:算术、逻辑和位运算符的简短可运行示例。
- Expression precedence — The Rust Reference(英文):Rust 计算运算符的精确顺序,从先到后。
- Operator expressions — The Rust Reference(英文):每个运算符的精确规则,包括整数溢出时会发生什么。