Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

プリミティブ型と演算子

Rust には、C++ とほぼ同じ算術演算子と論理演算子があります。bool は 両方の言語で同じです(truefalse リテラルも同様です)。Rust には 整数、符号なし整数、浮動小数点数について同様の概念があります。ただし構文は少し異なります。Rust では isize は整数を意味し、usize は 符号なし整数を意味します。これらの型はポインターサイズです。たとえば、32 ビットシステムでは、 usize は 32 ビット符号なし整数を意味します。Rust には明示的にサイズが指定された型もあり、 u または i の後に 8、16、32、64、または 128 が続きます。したがって、たとえば、u8 は 8 ビット符号なし整数で、i32 は 32 ビット符号付き整数です。浮動小数点数については、Rust には f32f64 があります。

数値リテラルには、その型を示すサフィックスを付けることができます。サフィックスが指定されていない場合、Rust は 型を推論しようとします。推論できない場合は、i32 または f64(小数点がある場合)を使用します。 例:

fn main() {
    let x: bool = true;
    let x = 34;   // 型は i32
    // let x = 2147483648; // エラー: リテラルが `i32` の範囲外
    let x = 34isize;
    let x = 34usize;
    let x = 34u8;
    let x = 34i64;
    let x = 34f32;
}

補足として、Rust では変数を再定義できるため、上記のコードは合法です - 各 let 文は新しい変数 x を作成し、以前の変数を隠します。これは、 変数がデフォルトでイミュータブルであるため、予想以上に有用です。

数値リテラルは、10 進数だけでなく、2 進数、8 進数、16 進数としても指定できます。 それぞれ 0b0o0x プレフィックスを使用します。数値リテラル内ではどこでも アンダースコアを使用でき、それは無視されます。例:

fn main() {
    let x = 12;
    let x = 0b1100;
    let x = 0o14;
    let x = 0xe;
    let y = 0b_1100_0011_1011_0001;
}

Rust には char と string がありますが、それらは Unicode であるため、 C++ とは少し異なります。ポインター、参照、ベクター(配列)を紹介した後で、 それらについて話すことにします。

Rust は数値型を暗黙的に強制変換しません。一般に、Rust は C++ よりも暗黙的な強制変換やサブタイピングがずっと少ないです。Rust は 明示的な強制変換とキャストに as キーワードを使用します。任意の数値は別の数値型にキャストできます。 as は数値型から boolean 型への変換には使用できませんが、 逆は可能です。例:

fn main() {
    let x = 34usize as isize;   // usize を isize にキャスト
    let x = 10 as f32;      // isize から float へ
    let x = 10.45f64 as i8; // float から i8 へ(精度が失われる)
    let x = 4u8 as u64;     // 精度が増す
    let x = 400u16 as u8;   // 144、精度が失われる(そのため値が変わる)
    println!("`400u16 as u8` gives {}", x);
    let x = -3i8 as u8;     // 253、符号付きから符号なしへ(符号が変わる)
    println!("`-3i8 as u8` gives {}", x);
    //let x = 45 as bool;  // 失敗します!(代わりに 45 != 0 を使用)
    let x = true as usize;  // bool を usize にキャスト(1 になる)
}

Rust には以下の演算子があります:

演算子
数値+, -, *, /, %
ビット単位|, &, ^, <<, >>
比較==, !=, >, <, >=, <=
短絡論理||, &&

これらはすべて C++ と同じように振る舞いますが、Rust は演算子を適用できる型について 少し厳格です - ビット単位演算子は整数にのみ適用でき、 論理演算子は boolean にのみ適用できます。Rust には数値を負にする 単項演算子 - があります。! 演算子は boolean を否定し、 整数型では各ビットを反転します(後者の場合は C++ の ~ と同等です)。Rust には C++ と同様に複合代入演算子(たとえば +=)がありますが、 インクリメント演算子やデクリメント演算子(たとえば ++)はありません。