Rustの制御構造、演算子とは:基本からしっかり学ぶRust入門(3)(1/2 ページ)
Rustについて基本からしっかり学んでいく本連載。第3回はリテラルと制御構文(条件分岐、繰り返し)について。
Rustについて基本からしっかり学んでいく本連載。連載第3回は、数値、文字列リテラルと制御構文(条件分岐、繰り返し)についてRustでどう書くか紹介します。
リテラル
連載第2回では、変数とデータ型を取り上げました。変数の初期化に数値を利用しましたがこれを「リテラル(literal)」と呼びます。リテラルは「見たままのもの」という意味ですが、数値や文字などの値そのものを指します。Rustでは、リテラルをどのように記述するのか紹介します。
数値リテラル
数値リテラルは、文字通り数値を表します、表1は、数値リテラルの一覧です。数値リテラルには必要に応じて接頭辞と接尾辞を付けることで、形式とデータ型を明示させることができます。
数値リテラル | 接頭辞 | 接尾辞 | 例 |
---|---|---|---|
整数(10進数) | なし | i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize | 123 369i16 45_678_u32 |
整数(16進数) | 0x | 0xffff 0x88 0xaa_u8 | |
整数(8進数) | 0o | 0o11 0o55 0o77_u8 | |
整数(2進数) | 0b | 0b00001111 0b1111_0000 0b01010101_u8 | |
整数(バイト) | b | ― | b'A' b'9' |
浮動小数点数 | なし | f32, f64 | 1.23 9.87f32, 4.56_f64 |
表1 数値リテラル |
整数の10進数、16進数、8進数の接頭辞は、C/C++でもおなじみの記述方式です。Rustでは2進数も表現でき、その場合には接頭辞は「0b」となります(bはbinaryの意)。バイトというのはu8型としてのみ使用できて、ASCII文字に接頭辞として「b」を付けて表現します。また、型接尾辞を付けることができ、その場合にはデータ型を明示できます(バイト以外)。さらに、数値の場合には、区切りとしてアンダースコア(_)を適宜挿入することができます。例えば、10進数で3桁ごとに区切りを入れて見やすくできます。
文字列リテラル
文字列リテラルは、文字列を表します。第2回でデータ型を取り上げましたが、そこには文字列型はありませんでした。Rustには、言語仕様に文字列型というものはありません。詳しくは本連載の所有権の回で取り上げますが、文字列はStringというライブラリで実装されます。では文字列リテラルとは何かというと、難しく考える必要はありません、ダブルクォーテーションで囲まれた文字の連続です。
let str = "Hello, world!";
この場合、文字列リテラルが初期化に使われたので、変数strは文字列リテラルへの参照になります(参照も本連載の所有権の回で取り上げます)。
文字を表す'A'、'B'や、論理値を表すtrueとfalseも、それぞれchar型、bool型のリテラルとして使用可能です。
式と演算子
続いて、制御構造において重要となる式と演算子について取り上げます。式も演算子も、C/C++と大きく変わりません。第2回で触れたように、Rustにおいても、式は評価され、最終的な演算結果を返します。演算子は、複合代入演算子を含む代入演算子、算術演算子、論理演算子、ビット演算子などC/C++で使えたものをほぼそのまま使うことができます。表2は、代表的な演算子です。
演算の種類 | 演算子 | 例 | 説明 |
---|---|---|---|
代入演算 | = | var = expr | 代入 |
数値演算 | + | expr + expr | 加算 |
+= | var += expr | 加算後に代入 | |
- | - expr | 算術否定 | |
- | expr - expr | 減算 | |
-= | var -= expr | 減算後に代入 | |
* | expr * expr | 乗算 | |
*= | var *= expr | 乗算後に代入 | |
/ | expr / expr | 除算 | |
/= | var /= expr | 除算後に代入 | |
% | expr % expr | 剰余演算 | |
%= | var %= expr | 剰余演算後に代入 | |
比較演算 | == | expr == expr | 等価比較 |
!= | expr != expr | 非等価比較 | |
< | expr < expr | 小なり比較 | |
<= | expr <= expr | 以下比較 | |
> | expr > expr | 大なり比較 | |
>= | expr >= expr | 以上比較 | |
論理演算 | ! | !expr | ビット反転、または論理反転 |
&& | expr && expr | 論理AND | |
|| | expr || expr | 論理OR | |
ビット演算 | & | expr & expr | ビットAND |
&= | var &= expr | ビットAND後に代入 | |
| | expr | expr | ビットOR | |
|= | var |= expr | ビットOR後に代入 | |
^ | expr ^ expr | ビットXOR | |
^= | var ^= expr | ビットXOR後に代入 | |
<< | expr << expr | 左シフト | |
<<= | var <<= expr | 左シフト後に代入 | |
>> | expr >> expr | 右シフト | |
>>= | var >>= expr | 右シフト後に代入 | |
表2 Rustの主な演算子 |
Rustには、他言語で見るようなインクリメント演算子(++)とデクリメント演算子(--)はありません。複合演算子(+=, -=)で代替可能です。なお、演算子がない正確な理由は不明ですが、前置と後置で評価結果が変わり、バグの原因になりやすいことから実装していないようです。
また注意が必要なのは、上記にある演算子でも、コンテキストによってはRust独自の演算子として異なった意味に解釈される可能性があることです。!演算子は論理否定に用いられますが、識別子の後にident!と続けるとidentが表すマクロの展開になります。また、&と*はC/C++でポインタ関連の演算となるように、Rustでは参照と参照外しといった意味で使われます。
Copyright © ITmedia, Inc. All Rights Reserved.