HoRain云--Rust运算符全解析:从入门到精通
【Rust运算符详解】本文系统介绍了Rust语言中的各类运算符及其特性:包括算术运算符(注意整数除法的截断特性)、比较运算符(要求类型一致)、具有短路特性的逻辑运算符、位运算符(含位移规则)、复合赋值运算符(不支持++/--)以及范围运算符等。特别强调了运算符优先级规则(建议用括号明确顺序)和运算符重载机制(通过实现std::ops模块trait)。注意事项指出:调试模式会检查整数溢出,浮点数比较
🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 |
专栏介绍 |
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
|
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
|
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
|
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
|
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
|
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
Rust 提供了丰富且类型安全的运算符来帮助你完成各种操作。我会通过分类介绍、示例代码和关键注意事项来带你了解 Rust 中的运算符。
🦀 Rust 运算符详解
📊 运算符概览
Rust 中的运算符按功能主要分为以下几类:
类别 | 代表符号 | 简单示例 |
---|---|---|
算术运算符 | + , - , * , / , % |
a + b |
比较运算符 | == , != , < , > , <= , >= |
a == b |
逻辑运算符 | && , ` |
|
位运算符 | & , ` |
, ^, !, <<, >>` |
赋值运算符 | = , += , -= , *= , /= , %= |
a += b |
范围运算符 | .. , ..= |
1..5 |
其他运算符 | as , ? , . , :: , & , * |
x as i32 |
🔢 算术运算符
算术运算符用于基本的数学计算。
运算符 | 描述 | 示例 |
---|---|---|
+ |
加法 | let sum = 5 + 10; // 15 |
- |
减法 | let difference = 95 - 5; // 90 |
* |
乘法 | let product = 4 * 30; // 120 |
/ |
除法 | let quotient = 56 / 32; // 1 |
% |
取模(求余数) | let remainder = 10 % 3; // 1 |
注意:
- 整数除法:会向零截断(舍弃小数部分)。例如
5 / 2
结果是2
,-5 / 3
结果是-1
。 - 浮点数除法:保留小数部分。例如
5.0 / 2.0
结果是2.5
。 - 除以零:整数除法中,如果除数为
0
,程序会在运行时 panic(崩溃)。
⚖️ 比较运算符
比较运算符用于比较两个值,并返回一个 bool
类型(true
或 false
)。
运算符 | 描述 | 示例 |
---|---|---|
== |
等于 | 5 == 5 // true |
!= |
不等于 | 5 != 6 // true |
< |
小于 | 10 > 5 // true |
> |
大于 | 5 < 10 // true |
<= |
小于等于 | 5 <= 10 // true |
>= |
大于等于 | 10 >= 10 // true |
注意:比较的双方类型必须一致。
🧠 逻辑运算符
逻辑运算符用于布尔值(true
和 false
)之间的逻辑操作。
运算符 | 描述 | 示例 |
---|---|---|
&& |
逻辑与 (AND) | true && false // false |
` | ` | |
! |
逻辑非 (NOT) | !true // false |
短路求值 (Short-Circuiting):&&
和 ||
运算符具有短路行为。
- 在
a && b
中,如果a
为false
,则不会计算b
。 - 在
a || b
中,如果a
为true
,则不会计算b
。
🔌 位运算符
位运算符用于对整数类型的二进制位进行操作。
运算符 | 描述 | 示例(假设 a=2, b=3) |
---|---|---|
& |
按位与 | a & b // 2 (0b10 & 0b11 = 0b10) |
` | ` | 按位或 |
^ |
按位异或 | a ^ b // 1 (0b10 ^ 0b11 = 0b01) |
! |
按位取反 | !b // -4 (按位取反,结果取决于位数) |
<< |
左移 | a << 1 // 4 (0b10 << 1 = 0b100) |
>> |
右移 | b >> 1 // 1 (0b11 >> 1 = 0b01) |
注意:
- 右移:
- 无符号整数:右移时左侧补
0
(逻辑右移)。 - 有符号整数:右移时左侧补符号位(算术右移)。
- 无符号整数:右移时左侧补
📋 赋值运算符
赋值运算符用于给变量赋值。
运算符 | 描述 | 示例 |
---|---|---|
= |
简单赋值 | let x = 5; |
+= |
加后赋值 | x += 1; // 等价于 x = x + 1; |
-= |
减后赋值 | x -= 1; // 等价于 x = x - 1; |
*= |
乘后赋值 | x *= 2; // 等价于 x = x * 2; |
/= |
除后赋值 | x /= 2; // 等价于 x = x / 2; |
%= |
取模后赋值 | x %= 2; // 等价于 x = x % 2; |
注意:
- Rust 不支持
++
和--
运算符。需使用x += 1
和x -= 1
。 - 复合赋值表达式的值始终是
()
(单元类型),而不是存储的值。
🧭 范围运算符
范围运算符用于生成一个范围的数值,常用于循环和模式匹配。
运算符 | 描述 | 示例 |
---|---|---|
.. |
左闭右开区间 | 1..5 // 1, 2, 3, 4 |
..= |
闭区间 | 1..=5 // 1, 2, 3, 4, 5 |
🔀 其他常用运算符
运算符 | 描述 | 示例 |
---|---|---|
as |
显式类型转换 | let x: i32 = 10; let y: u8 = x as u8; |
? |
错误传播 | let value = some_function()?; |
. |
成员访问 | vec.len() |
:: |
路径分隔 | std::fs::read_to_string |
& , * |
引用和解引用 | let x = 5; let y = &x; let z = *y; |
[] |
索引 | let first = arr[0]; |
🧩 运算符优先级
运算符的优先级决定了表达式中操作的执行顺序。以下是一些常见的优先级规则(从高到低):
- 括号
()
- 单目运算符(如
-
,!
,*
,&
) as
类型转换- 乘、除、取余
*
,/
,%
- 加、减
+
,-
- 位移
<<
,>>
- 位与
&
- 位异或
^
- 位或
|
- 比较运算符(如
==
,!=
,<
,>
,<=
,>=
) - 逻辑与
&&
- 逻辑或
||
- 范围
..
,..=
- 赋值运算符
=
,+=
等
最佳实践:为了代码清晰且避免错误,强烈推荐使用括号 ()
来明确指定运算顺序,而不是依赖记忆优先级。
💡 运算符重载
Rust 允许通过实现 std::ops
模块中相应的 trait 来为自定义类型重载大部分运算符。例如,实现 std::ops::Add
trait 可以重载 +
运算符:
use std::ops::Add;
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
// 为 Point 类型重载 `+` 运算符
impl Add for Point {
type Output = Self; // 输出类型是 Point 自身
fn add(self, other: Self) -> Self::Output {
Point {
x: self.x + other.x,
y: self.y + other.y,
}
}
}
fn main() {
let p1 = Point { x: 1, y: 2 };
let p2 = Point { x: 3, y: 4 };
let p3 = p1 + p2; // 使用重载的 +
println!("{:?}", p3); // 输出: Point { x: 4, y: 6 }
}
类似地,你可以为你的自定义类型重载其他运算符,如 -
(Sub
)、*
(Mul
)、/
(Div
)、%
(Rem
)等。
⚠️ 注意事项
- 整数溢出:
- 在 调试 (debug) 模式下,Rust 会检查整数溢出,发生溢出时会导致 panic。
- 在 发布 (release) 模式下,Rust 不检查整数溢出,而是执行二进制补码环绕(例如,
u8::MAX + 1
会得到0
)。
- 浮点数比较:由于浮点数的精度问题,直接使用
==
或!=
比较浮点数可能会因精度误差导致意外结果。通常建议判断两个浮点数的差值是否小于一个极小值(例如f64::EPSILON
),或者使用特定的数学库。 - 类型一致性:Rust 是强类型语言,运算符两边的操作数类型通常必须相同,否则需要显式使用
as
进行类型转换。
希望这份教程能帮助你全面理解 Rust 中的运算符!实践是掌握的关键,多写代码来熟悉它们吧。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
更多推荐
所有评论(0)