Opérateurs Rust
En Rust, qu'il s'agisse de simples calculs numériques, de jugements logiques, ou de correspondances de motifs et d'opérations bit à bit plus complexes, les opérateurs jouent un rôle central.
Rust prend en charge à la fois les opérateurs courants familiers des langages de la famille C et fournit certains symboles d'opérateurs uniques. Maîtriser ces opérateurs permet non seulement de rendre le code plus concis et efficace, mais aussi de mieux comprendre la sémantique de Rust.
1. Opérateurs arithmétiques
| Operator | Description | Exemple | Résultat |
|---|---|---|---|
+ |
Addition | 5 + 2 |
7 |
- |
Soustraction | 5 - 2 |
3 |
* |
Multiplication | 5 * 2 |
10 |
/ |
Division (division entière) | 5 / 2 |
2(entier) |
% |
Reste | 5 % 2 |
1 |
Exemple
fn main() {
let a = 10;
let b = 3;
println!("a + b = {}", a + b);
println!("a - b = {}", a - b);
println!("a * b = {}", a * b);
println!("a / b = {}", a / b);
println!("a % b = {}", a % b);
}
let a = 10;
let b = 3;
println!("a + b = {}", a + b);
println!("a - b = {}", a - b);
println!("a * b = {}", a * b);
println!("a / b = {}", a / b);
println!("a % b = {}", a % b);
}
Sortie :
a + b = 13 a - b = 7 a * b = 30 a / b = 3 a % b = 1
Rust n'a pas d'opérateur d'exponentiation tel que**ou^(note :^est un OU exclusif bit à bit). Pour effectuer une exponentiation, vous devez utiliser les méthodes intégrées pow ou powf :
- Les types entiersutilisent
.pow(exp: u32) - Les types à virgule flottanteutilisent
.powf(exp: f64)
Exponentiation entière
Exemple
fn main() {
let base: i32 = 2;
let result = base.pow(3); // 2^3
println!("2^3 = {}", result);
}
let base: i32 = 2;
let result = base.pow(3); // 2^3
println!("2^3 = {}", result);
}
Sortie :
2^3 = 8
Exponentiation en virgule flottante
Exemple
fn main() {
let base: f64 = 2.0;
let result = base.powf(2.5); // 2^2.5
println!("2^2.5 = {}", result);
}
let base: f64 = 2.0;
let result = base.powf(2.5); // 2^2.5
println!("2^2.5 = {}", result);
}
Sortie :
2^2.5 = 5.656854249492381
2. Opérateurs relationnels (de comparaison)
| Operator | Description | Exemple | Résultat |
|---|---|---|---|
== |
Equal | 5 == 5 |
true |
!= |
Différent de | 5 != 2 |
true |
> |
Supérieur à | 5 > 2 |
true |
< |
Inférieur à | 5 < 2 |
false |
>= |
Supérieur ou égal à | 5 >= 5 |
true |
<= |
Inférieur ou égal à | 2 <= 5 |
true |
Exemple
fn main() {
let x = 5;
let y = 10;
println!("x == y : {}", x == y);
println!("x != y : {}", x != y);
println!("x > y : {}", x > y);
println!("x < y : {}", x < y);
println!("x >= y : {}", x >= y);
println!("x <= y : {}", x <= y);
}
let x = 5;
let y = 10;
println!("x == y : {}", x == y);
println!("x != y : {}", x != y);
println!("x > y : {}", x > y);
println!("x < y : {}", x < y);
println!("x >= y : {}", x >= y);
println!("x <= y : {}", x <= y);
}
Sortie :
x == y : false x != y : true x > y : false x < y : true x >= y : false x <= y : true
3. Opérateurs logiques
| Operator | Description | Exemple | Résultat |
|---|---|---|---|
&& |
ET logique | true && false |
false |
|| |
OU logique | true || false |
true |
! |
NON logique | !true |
false |
Exemple
fn main() {
let a = true;
let b = false;
println!("a && b = {}", a && b);
println!("a || b = {}", a || b);
println!("!a = {}", !a);
}
let a = true;
let b = false;
println!("a && b = {}", a && b);
println!("a || b = {}", a || b);
println!("!a = {}", !a);
}
Sortie :
a && b = false a || b = true !a = false
4. Opérateurs bit à bit
| Operator | Description | Exemple | Résultat |
|---|---|---|---|
& |
ET bit à bit | 5 & 3 |
1 |
| |
OU bit à bit | 5 | 3 |
7 |
^ |
OU exclusif bit à bit | 5 ^ 3 |
6 |
! |
NON bit à bit | !5 |
-6 |
<< |
Décalage à gauche | 5 << 1 |
10 |
>> |
Décalage à droite | 5 >> 1 |
2 |
Exemple
fn main() {
let x: u8 = 0b1010; // 10
let y: u8 = 0b1100; // 12
println!("x & y = {:b}", x & y);
println!("x | y = {:b}", x | y);
println!("x ^ y = {:b}", x ^ y);
println!("!x = {:b}", !x);
println!("x << 1 = {:b}", x << 1);
println!("x >> 1 = {:b}", x >> 1);
}
let x: u8 = 0b1010; // 10
let y: u8 = 0b1100; // 12
println!("x & y = {:b}", x & y);
println!("x | y = {:b}", x | y);
println!("x ^ y = {:b}", x ^ y);
println!("!x = {:b}", !x);
println!("x << 1 = {:b}", x << 1);
println!("x >> 1 = {:b}", x >> 1);
}
Sortie :
x & y = 1000 x | y = 1110 x ^ y = 110 !x = 11110101 x << 1 = 10100 x >> 1 = 101
5. Opérateurs d'affectation et d'affectation composée
| Operator | Description | Exemple | Résultat |
|---|---|---|---|
= |
Affectation | let mut x = 5; x = 3; |
x = 3 |
+= |
Addition et affectation | x += 2 |
x = x + 2 |
-= |
Soustraction et affectation | x -= 2 |
x = x - 2 |
*= |
Multiplication et affectation | x *= 2 |
x = x * 2 |
/= |
Division et affectation | x /= 2 |
x = x / 2 |
%= |
Reste et affectation | x %= 2 |
x = x % 2 |
&= |= ^= <<= >>= |
Affectation composée bit à bit | x &= 2 |
similaire |
Exemple
fn main() {
let mut n = 5;
n += 3;
println!("n += 3 -> {}", n);
n *= 2;
println!("n *= 2 -> {}", n);
n >>= 1;
println!("n >>= 1 -> {}", n);
}
let mut n = 5;
n += 3;
println!("n += 3 -> {}", n);
n *= 2;
println!("n *= 2 -> {}", n);
n >>= 1;
println!("n >>= 1 -> {}", n);
}
Sortie :
n += 3 -> 8 n *= 2 -> 16 n >>= 1 -> 8
6. Autres opérateurs courants
| Operator | Description | Exemple |
|---|---|---|
.. |
Intervalle (borne droite exclue) | 0..5produit de 0 à 4 |
..= |
Intervalle (extrémité droite incluse) | 0..=5produit de 0 à 5 |
as |
Conversion de type | 5 as f32 |
? |
Propagation des erreurs (enResult) |
some()?; |
* |
Déréférencement | *ptr |
& |
Prendre une référence | &x |
ref |
Lier en tant que référence | let ref y = x; |
Exemple
fn main() {
let x = 5;
let y = x as f64;
for i in 1..4 {
print!("{} ", i);
}
println!();
for i in 1..=3 {
print!("{} ", i);
}
println!();
let a = 10;
let b = &a;
println!("*b = {}", *b);
}
let x = 5;
let y = x as f64;
for i in 1..4 {
print!("{} ", i);
}
println!();
for i in 1..=3 {
print!("{} ", i);
}
println!();
let a = 10;
let b = &a;
println!("*b = {}", *b);
}
Sortie :
1 2 3 1 2 3 *b = 10Autres extensions