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);
}

出力:

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);
}

出力:

2^3 = 8

浮動小数点数のべき乗

例

fn main() {
    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);
}

出力:

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);
}

出力:

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);
}

出力:

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);
}

出力:

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);
}

出力:

1 2 3 
1 2 3 
*b = 10
その他の拡張