組み込み型、演算子
RustにもC++と全く同じ数値演算および論理演算子が存在する。bool型は両言語で同じだ(true、falseリテラルも同じだ)。
Rustにも整数型、非負整数型、浮動小数点数型の概念が存在する。しかし、見た目は少し異なる。
Rustでは、整数を表すのにintを使い、自然数を表すのにuintを使用し、どちらもポインタのサイズと等しい。例として32ビットシステムならば、uintは32ビットサイズの非負整数型になる。
さらにRustにはサイズを明示した整数型も存在し、こちらはuまたはiの後ろに8,16,32,64の数字をつけて表す。したがって、例えば、u8と書いたら、8ビットの非負整数型、i32と書いたら、32ビットの整数型を意味する。浮動小数点数なら、f32とf64がある。
数値リテラルは、接尾辞をつけて型を表現することができる(型のint,uintではなくu,iを用いる)。接尾辞がなければ、コンパイラが型の推論を試みる。推論にも失敗したら、intかf64(小数点がある場合)になる。
fn main() { let x: bool = true; let x = 34; // type int let x = 34u; // type uint let x: u8 = 34u8; let x = 34i64; let x = 34f32; }メモ書き:Rustでは、変数の再定義ができる。ゆえに上記のコードは正しい。
つまり、個々のlet文が新変数xを定義し、直前のものを隠蔽するのだ。この性質は、変数が標準で不変的であるため、思った以上に役に立つ。
数値リテラルは、10進数以外にも2進数、8進数、16進数で記述することができる。それぞれ0b,0o,0xという接頭辞を使えばいいのだ。
数値リテラル内にアンダースコアを入れることもでき、このアンダースコアはコンパイル時に無視される。
fn main() { let x = 12; let x = 0x1100; let x = 0o14; let x = 0xe; let y = 0x_1100_0011_1011_0001; }Rustにも、文字型と文字列型があるが、こちらはユニコードでエンコードされているため、C++のものとは少し異なる。これらについて語るのは、ポインタと参照、ベクターコンテナ(配列)を導入してからにしよう。
Rustでは、数値型は勝手に丸められない。一般に、Rustでは、C++よりもはるかに無断で精度落ちやキャストが発生することが少ない。明示的に丸め込みやキャストを行うにはasキーワードを使う。
数値型は数値型にならキャストできる。asキーワードでは、論理値と数値型の相互変換はできない。
fn main() { let x = 34u as int; // uintからintへキャスト let x = 10 as f32; // intからfloatへ let x = 10.45f64 as i8; // floatからintへ(精度落ち) 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 = 45u as bool; // 不可能! }Rustには以下に挙げる演算子がある。
数値演算子: +, -, *, /, %
ビット演算子: |, &, ^, <<, >>
比較演算子: ==, !=, >, <, >=, <=
論理演算子: ||, &&
演算子の挙動自体はC++と同じだが、Rustのものは適用できる型が少し限定的になっている。ビット演算子は、整数型にしか適用できないし、論理演算子も論理値にしか適用できない。
Rustには単項の-演算子が存在し、数値の符号を反転させる。!演算子は、論理値を反転させ、整数型の全ビット値を反転させる(後者の意味ではC++の~演算子と等価)。
また、RustにもC++同様、各種代入演算子(+=など)が存在するが、インクリメント、デクリメント(++など)は存在しない。
原文: https://github.com/nrc/r4cppp/blob/master/primitives.md
0 件のコメント:
コメントを投稿
なにか意見や感想、質問などがあれば、ご自由にお書きください。