Dart 算術演算子

基本二項算術演算子

二つの数値同士の計算に使用し、全7種類あります。四則演算、整数除算、剰余、単項マイナス演算子を含みます

演算子役割説明
+足し算
-引き算
-式単項マイナス(符号反転、数値の正負を逆にする)
*掛け算
/普通の除算、結果は常に double 浮動小数点数型
~/整数除算、小数部分を切り捨て、int 整数型を返す
%剰余(整数除算の余りを取得)

除算は他言語と比べ特殊な点があり、/ の計算結果は必ず浮動小数点数になります。整数が必要な場合は ~/ を使うため、プログラミング経験者は特に注意してください。

サンプルコード

void main() {
        // 四則演算・整数除算・剰余の検証
	print(2 + 3 == 5);
	print(2 - 3 == -1);
	print(2 * 3 == 6);
	print(5 / 2 == 2.5);  // 普通除算は小数doubleを出力
	print(5 ~/ 2 == 2);   // 整数除算は整数部分のみ保持int
	print(5 % 2 == 1);    // % 剰余演算子は整数除算の余りのみ取得;

	// 商と余りを文字列連結した例
	print('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
}Code language: Dart (dart)

実行結果

インクリメント / デクリメント演算子

Dartは前置後置の2種類のインクリメント ++、デクリメント -- に対応しています。核心的な違い:変数を先に更新するか、値を先に取得するか

演算子実行ロジック式が最終的に返す値
++var変数に+1してから演算に参加インクリメント後の新しい値
var++変数の元の値を先に演算に使い、演算完了後に変数に+1インクリメント前の元の値
--var変数に-1してから演算に参加デクリメント後の新しい値
var--変数の元の値を先に演算に使い、演算完了後に変数に-1デクリメント前の元の値
void main() {
	int a;
	int b;

	// 1. 前置インクリメント ++a:先に増加、その後代入
	a = 0;
	b = ++a;
	print(a == b); // a=1、b=1、1 == 1

	// 2. 後置インクリメント a++:先に代入、その後増加
	a = 0;
	b = a++;
	print(a != b); // a=1、b=0、1 != 0

	// 3. 前置デクリメント --a:先に減少、その後代入
	a = 0;
	b = --a;
	print(a == b); // a=-1、b=-1、-1 == -1

	// 4. 後置デクリメント a--:先に代入、その後減少
	a = 0;
	b = a--;
	print(a != b); // a=-1、b=0、-1 != 0
}
Code language: PHP (php)

上記例の出力はすべてtrueとなります

注意点:++または–を前置と後置に置くと、場面によって動作が異なります。

単独で使用する場合、例えば:

int a = 1;
++a;

int b  = 1;
b++;

print(a);
print(b);Code language: PHP (php)

上記コードの最終出力はどちらも2になります

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
2
2
Code language: CSS (css)

同様に — も同じ動作で、最終的に変数は+1または-1されます。

しかし、++ — を式の中で使用する場合、例:

void main() {
  int a = 5;
  // 後置:先に5を計算に使い、計算後aが6になる
  int res1 = a++ * 2;
  print(res1); // 10
  print(a);  // 6

  int b= 5;
  // 前置:先にbを6にしてから6で計算
  int res2 = ++b * 2;
  print(res2); // 12
  print(b); // 6
}Code language: PHP (php)

aとbの最終値は同じ6ですが、res1とres2の結果は異なります。++の位置が前か後かだけの僅かな差です。

後置a++の仕組み:まずaの値5でa*2=10を実行、この時点のaは5のままres1に代入、その後aに+1して6になる。

前置++bの仕組み:先にbに+1して6にし、その後6*2=12がres2に入る。

int res1 = a++ * 2; を分解すると:

int res1 = a * 2;
a = a +1;

int res2 = ++b * 2; を分解すると:

b = b+1;
int res2 = b * 2;

覚えやすい口訣:

前置は先に変更、後置は先に使用;

前置は新しい値を返し、後置は元の値を返す。

まとめ

前置 ++a / --aまず変数自身を更新し、更新後の値を演算・代入に使用する

後置 a++ / a--まず変数の元の値を演算・代入に使用し、演算完了後に変数を更新する

以下のサンプルを実行して確認してみましょう

void main() {
  int a = 0;
  int b = ++a; 
  // 手順1:a = a + 1 → aが1になる
  // 手順2:更新後のa(1)をbに代入
  print(a); // 1
  print(b); // 1
}
void main() {
  int a = 0;
  int b = a++;
  // 手順1:元のaの値0をbに代入
  // 手順2:a = a + 1 → aが1になる
  print(a); // 1
  print(b); // 0
}
void main() {
  int a = 0;
  int b = --a;
  // 手順1:a = a - 1 → aが-1になる
  // 手順2:更新後のa(-1)をbに代入
  print(a); // -1
  print(b); // -1
}
void main() {
  int a = 0;
  int b = a--;
  // 手順1:元のaの値0をbに代入
  // 手順2:a = a - 1 → aが-1になる
  print(a); // -1
  print(b); // 0
}

以上が++ — の前置・後置の最も簡単な例です。自身でコンパイル・実行し、動作の違いを体感してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です