演算子とは、算数でも習った足し算のプラス記号や引き算のマイナス記号のように特別な意味を持った記号のことです。
Dartでは基本的にほかのプログラミング言語と同等の演算子が利用できます。
算術演算子(Arithmetic operators)
四則演算などを行うための演算子です。
二項演算子
2つの値を演算するもの。
使い方も算数で習った書き方と一緒です。
演算子 | 意味 |
---|---|
+ | 足し算 |
– | 引き算 |
–expr | マイナス(値の符号を逆にする) |
* | 掛け算 |
/ | 割り算 |
~/ | 割り算(結果は整数) |
% | 剰余(割り算した余りを求める) |
次のように利用します。
次のソースコードを実行すると各演算結果が表示されます。
int value1 = 10;
int value2 = 3;
print(value1 + value2); // 結果は13
print(value1 - value2); // 結果は17
print(-value1); // 結果は-10
print(value1 * value2); // 結果は30
print(value1 / value2); // 結果は3.3333333333333335
print(value1 ~/ value2); // 結果は3
print(value1 % value2); // 結果は1
インクリメント・デクリメント演算子
値に+1することをインクリメント、-1することをデクリメントと呼びます。
演算子を変数の前に書くか後に書くかで意味が異なるので注意が必要です。
種別 | 演算子 | 意味 |
---|---|---|
インクリメント | ++val | +1してからvalに代入 |
val++ | 処理してから+1 してvalに代入 | |
デクリメント | —val | -1してからvalに代入 |
val— | 処理してから-1してvalに代入 |
次のように利用します。
int value1 = 10;
int value2 = 10;
// インクリメント(前置)
print(value1++); // 結果は10
print(++value2); // 結果は11
print(value1); // 結果は11
print(value2); // 結果は11
// インクリメント(後置)
print(value1--); // 結果は11
print(value2--); // 結果は10
print(value1); // 結果は10
print(value2); // 結果は10
前置と後置を理解して使わないと1ずれた状態で処理してしまうので注意
等価演算子および関係演算子(Equality and relational operators)
2つの値を評価(比較)する際に使うのが等価演算子と関係演算子。
演算子 | 意味 |
---|---|
== | 2つの値が同じならば |
!= | 2つの値が異なるならば |
> | 左の値が右の値より大きいならば |
< | 左の値が右の値より小さいならば |
>= | 左の値が右の値以上ならば |
<= | 左の値が右の値以下ならば |
条件式で利用したりするほか、評価結果はbool型の値として返却するのでその結果をbool型の変数に代入することもできます。
int value1 = 10;
int value2 = 10;
int value3 = 5;
print(value1 == value2); // 10 == 10、結果はtrue
print(value1 != value2); // 10 != 10、結果はfalse
print(value2 > value3); // 10 > 5、結果はtrue
print(value2 < value3); // 10 < 5、結果はfalse
型のテスト演算子
変数や値の型をキャスト/評価する際に使う演算子。
演算子 | 意味 |
---|---|
as | 型のキャスト |
is | オブジェクトと型の比較 |
is! | オブジェクトと型の比較(NOT) |
事前に値が分からないvar型の変数を扱う際に利用します。
Object value1 = 'abc';
print((value1 as String).length); // 文字列value1の長さは3
String value2 = 'def';
print(value2 is String); // 結果はtrue
print(value2 is! String); // 結果はfalse
ビット演算子/シフト演算子(Bitwise and shift operators)
値をビットで扱う際に利用する演算子。
演算子 | 意味 |
---|---|
& | 論理積(AND) |
| | 論理和(OR) |
^ | 非排他的論理和(XOR) |
~expr | ビットの反転 |
<< | 指定した分ビットを左へシフト |
>> | 指定した分ビットを右へシフト |
>>> | 指定した分ビットを右へシフト(符号なし) |
ビットで扱いたい値以外ではあまり使用しません。
int value1 = 0x03; // 0x03 → 0b00000011
int value2 = 0x0e; // 0x0e → 0b00001110
// 次の評価はすべてtrueになる
print(value1 & value2 == 0x02); // 0x02 → 0b00000010
print(value1 | value2 == 0x0f); // 0x0f → 0b00001111
print(value1 ^ value2 == 0x0d); // 0x0d → 0b00001101
print(~value1 == -0x04); // -0x04 → 0b11111100
print(value1 << 2 == 0x0c); // 0x0c → 0b00001100
print(value2 >> 1 == 0x07); // 0x07 → 0b00000111
print(value1 >>> 1 == 0x01); // 0x01 → 0b00000001
2進数とか補数のことを理解していないと分かりづらいかも
代入演算子(Assignment operators)
変数に値を代入する際に利用する演算子。
=とほかの演算子を組み合わせて使用することで、短縮形で記述することができます。
演算子 | 意味 | 記載例 | 同等の表現 |
---|---|---|---|
= | 左辺に右辺の値を代入する | a = b; | なし |
+= | 左辺と右辺を足し算した結果を左辺に代入する | a += b; | a = a + b; |
-= | 左辺から右辺を引き算した結果を左辺に代入する | a -= b; | a = a – b; |
*= | 左辺と右辺を掛け算した結果を左辺に代入する | a *= b; | a = a * b; |
/= | 左辺を右辺で割り算した結果を左辺に代入する | a /= b; | a = a / b; |
~/= | 左辺を右辺で割り算した結果を左辺に代入する(整数) | a ~/= b; | a = a ~/ b; |
%= | 左辺を右辺で割り算した余りを左辺に代入する | a %= b; | a = a % b; |
<<= | 左辺を右辺分でビットを左シフトした結果を左辺に代入する | a <<= b; | a = a << b; |
>>= | 左辺を右辺分でビットを右シフトした結果を左辺に代入する | a >>= b; | a = a >> b; |
>>>= | 左辺を右辺分でビットを右シフトした結果を左辺に代入する(符号なし) | a >>>= b; | a = a >>> b; |
&= | 左辺と右辺の論理積を左辺に代入する | a &= b; | a = a & b; |
|= | 左辺と右辺の論理和を左辺に代入する | a |= b; | a = a | b; |
^= | 左辺と右辺の排他的論理和を左辺に代入する | a ^= b; | a = a ^ b; |
論理演算子(Logical operators)
2つ以上のbool型の値を組み合わせて評価する際に利用する演算子。
複数の条件式を一度に評価する際に利用します。
演算子 | 意味 |
---|---|
!expr | 否定(NOT) |
&& | 論理積(AND) |
|| | 論理和(OR) |
次のように使用します。
print(true && true); // 結果はtrue
print(true && false); // 結果はfalse
print(false && false); // 結果はfalse
print(value1 == 1 && value2 == 2); // 結果はtrue
print(true || true); // 結果はtrue
print(true || false); // 結果はtrue
print(false || false); // 結果はfalse
print(value1 == 1 && value2 != 2); // 結果はfalse
条件式(Conditional expressions)
?を使うと、条件によって返す値を切り替えることができます。
条件分岐を利用するよりもシンプルにコードを記述することができます。
条件式 | 意味 |
---|---|
条件式 ? expr1 : expr2 | 条件式が真(true)ならばexpr1を、偽(false)ならばexpr2を返す |
expr1 ?? expr2 | expr1がnullならばexpr2を、nullでなければexpr1を返す |
例えば次のように利用します。
int value1 = 1;
int value2 = 2;
print(value1 == 1 ? '1です' : '1ではない'); // 結果は「1です」
print(value2 == 1 ? '1です' : '1ではない'); // 結果は「1ではない」
String? value3;
String? value4 = 'abc';
print(value3 ?? 'nullです'); // 結果は「nullです」
print(value4 ?? 'nullです'); // 結果は「abc」
まとめ
ビット演算子/シフト演算子については使うシーンが限られますが、それ以外の演算子についてはどれもこれも使います。
分かりづらい部分は実際に値を変えながらいろいろ試してみましょう。
※このくらいならDartPadを使って試すのが手っ取り早いです。
コメント