Rust 演算子
Rust では、単純な数値計算や論理判断から、より複雑なパターンマッチングやビット操作に至るまで、演算子は中心的な役割を担っています。
Rust は、私たちがよく知る C 系言語の一般的な演算子をサポートしているだけでなく、独自の操作記号もいくつか提供しています。これらの演算子をしっかり使いこなすことで、コードをより簡潔かつ効率的にできるだけでなく、Rust のセマンティクスをより深く理解するのにも役立ちます。
1、算術演算子
| 演算子 | 説明 | 例 | 結果 |
|---|---|---|---|
+ |
加算 | 5 + 2 |
7 |
- |
減算 | 5 - 2 |
3 |
* |
乗算 | 5 * 2 |
10 |
/ |
除算(整数除算) | 5 / 2 |
2(整数) |
% |
剰余 | 5 % 2 |
1 |
例
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);
}
出力:
a + b = 13 a - b = 7 a * b = 30 a / b = 3 a % b = 1
Rust には** 或 ^のようなべき乗演算子はありません(注意:^はビット単位の XOR です)。べき乗を行うには、組み込みの pow または powf メソッドを使用する必要があります:
- 整数型使用
.pow(exp: u32) - 浮動小数点型使用
.powf(exp: f64)
整数のべき乗
例
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);
}
出力:
2^3 = 8
浮動小数点数のべき乗
例
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);
}
出力:
2^2.5 = 5.656854249492381
2、関係(比較)演算子
| 演算子 | 説明 | 例 | 結果 |
|---|---|---|---|
== |
等しい | 5 == 5 |
true |
!= |
等しくない | 5 != 2 |
true |
> |
より大きい | 5 > 2 |
true |
< |
より小さい | 5 < 2 |
false |
>= |
以上 | 5 >= 5 |
true |
<= |
以下 | 2 <= 5 |
true |
例
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);
}
出力:
x == y : false x != y : true x > y : false x < y : true x >= y : false x <= y : true
3、論理演算子
| 演算子 | 説明 | 例 | 結果 |
|---|---|---|---|
&& |
論理積(AND) | true && false |
false |
|| |
論理和(OR) | true || false |
true |
! |
論理否定(NOT) | !true |
false |
例
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);
}
出力:
a && b = false a || b = true !a = false
4、ビット演算子
| 演算子 | 説明 | 例 | 結果 |
|---|---|---|---|
& |
ビットごとの AND | 5 & 3 |
1 |
| |
ビットごとの OR | 5 | 3 |
7 |
^ |
ビットごとの XOR | 5 ^ 3 |
6 |
! |
ビットごとの NOT(反転) | !5 |
-6 |
<< |
左シフト | 5 << 1 |
10 |
>> |
右シフト | 5 >> 1 |
2 |
例
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);
}
出力:
x & y = 1000 x | y = 1110 x ^ y = 110 !x = 11110101 x << 1 = 10100 x >> 1 = 101
5、代入演算子と複合代入演算子
| 演算子 | 説明 | 例 | 結果 |
|---|---|---|---|
= |
代入 | let mut x = 5; x = 3; |
x = 3 |
+= |
加算して代入 | x += 2 |
x = x + 2 |
-= |
減算して代入 | x -= 2 |
x = x - 2 |
*= |
乗算して代入 | x *= 2 |
x = x * 2 |
/= |
除算して代入 | x /= 2 |
x = x / 2 |
%= |
剰余を求めて代入 | x %= 2 |
x = x % 2 |
&= |= ^= <<= >>= |
ビット演算の複合代入 | x &= 2 |
同様 |
例
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);
}
出力:
n += 3 -> 8 n *= 2 -> 16 n >>= 1 -> 8
6、 その他の一般的な演算子
| 演算子 | 説明 | 例 |
|---|---|---|
.. |
範囲(右端を含まない) | 0..50 から 4 を生成 |
..= |
範囲(右端を含む) | 0..=50 から 5 を生成 |
as |
型変換 | 5 as f32 |
? |
エラーの伝播(Result内) |
some()?; |
* |
参照外し | *ptr |
& |
参照を取る | &x |
ref |
参照としてバインド | let ref y = x; |
例
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);
}
出力:
1 2 3 1 2 3 *b = 10その他の拡張