連載
» 2021年10月01日 05時00分 公開

Rustの制御構造、演算子とは基本からしっかり学ぶRust入門(3)(1/2 ページ)

Rustについて基本からしっかり学んでいく本連載。第3回はリテラルと制御構文(条件分岐、繰り返し)について。

[山内直(著)/山田祥寛(監修),WINGSプロジェクト]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 本連載のサンプルコードをGitHubで公開しています。こちらからダウンロードしてみてください。具体的な利用方法は連載第1回を参考にしてください。


 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では参照と参照外しといった意味で使われます。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。