Dart 論理演算子

論理演算は真偽値(true /false)のみを扱い、「条件が成立するかどうか」を判定するために使用します。計算結果は二種類のみ:true(真、条件一致)、false(偽、条件不一致)。

コード内のすべての if、while/forループの判定、switch条件は、内部的にすべて論理演算で実装されています。

主に3種類存在します:論理積・論理和・否定

演算子名称動作説明
&&論理積(AND)両辺が同時にtrueの場合のみ結果がtrue;短絡評価あり
||論理和(OR)どちらか一方がtrueなら全体の結果がtrue;短絡評価あり
!expr論理否定(NOT、反転)真偽値を反転:truefalseに、falsetrueに変換

論理積・論理和・否定は中学で学んだ直列回路・並列回路と考え方が似ています。直列回路が論理積、並列回路が論理和に相当します。

1. 論理否定 !

単一の真偽式の値を反転させます。

使い方:

!真偽式

void main() {
  bool isMale = false;
  print(!isMale); // true

  bool flag = true;
  print(!flag); // false
}Code language: PHP (php)

上記のisMaleとflagは元々false、trueですが、否定演算子を通すと逆の値になります。

式全体に適用することも可能です。例えば

void main() {
  int age = 12;
  print(!(age>18)); // true
}Code language: JavaScript (javascript)

元々 age > 18 の結果はfalseですが、先頭の!で反転されtrueが出力されます。

2. 論理積 &&

結果
true && truetrue
true && falsefalse
false && truefalse
false && falsefalse

両辺がすべてtrueの場合のみ結果がtrue。どちらか一方がfalseなら結果はfalseになります。

短絡評価の特徴:左辺がfalseの場合、右辺のコードは実行されず、即座にfalseを返します。

二つのスイッチが両方閉じている(true)時のみ電球が点灯(true)、どちらか一方でも開いている(false)なら電球は消灯(false)します。左辺がfalseと分かった時点で右辺を実行する必要がない仕組みです。

void main() {
  bool fun1() {
    print("関数が実行されました!");
    return true;
  }

  bool left = false;
  // 左辺が false なので、右辺 fun1() は実行されない
  bool res = left && fun1();
  print("最終結果:$res");
}Code language: PHP (php)

実行結果

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
最終結果:false
Code language: JavaScript (javascript)

fun1内部にエラーや例外が存在しても、関数自体が実行されないためエラーは発生しません。

論理積の使用例

void main() {
  String name = 'admin';
  String password = '123321';

  // && 両辺がtrueの場合のみ条件成立
  if (name=='admin' && password =='456654') {
    print("ログイン成功");
  } else {
    print("アカウントまたはパスワードが間違っています");
  }
}Code language: JavaScript (javascript)

実行結果

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
アカウントまたはパスワードが間違っていますCode language: CSS (css)

3. 論理和 ||

左辺がtrueの場合、右辺コードは実行されず即座にtrueを返します。

結果
true || truetrue
true || falsetrue
false || truetrue
false || falsefalse

例を見てみましょう

void main() {
  bool fun1() {
    print("関数実行");
    return true;
  }
  // 左辺trueのため短絡評価が発生、fun1()は実行されない
  bool res = true || fun1();
  print(res); // true
}Code language: PHP (php)

|| の左辺がtrueなので、右辺のfun1は実行されません。

二つのスイッチのうち一つでも閉じていればtrue、電球が点灯します。

void main() {
        bool isParentAgree = true;
	int age = 12;
	if(age>=13 || isParentAgree){
	  print("入場可能");
	}
}Code language: JavaScript (javascript)

まとめ

A && B:Aがfalseの場合、即座にfalseを返し、Bの評価・実行は行わない

A || B:Aがtrueの場合、即座にtrueを返し、Bの評価・実行は行わない

実行速度を向上させるだけでなく、エラー回避にも活用されます(null判定で頻出)

例:

String? name;
// nameがnullでない場合のみlengthにアクセス、短絡でnull参照エラーを回避
if(name != null && name.length > 0) 
{

}Code language: JavaScript (javascript)

上記コードで、直接name.lengthを実行するとnameがnullのためエラーが発生します。先にname != nullを判定し、nameがnullの場合最初の条件がfalseとなるため後続の処理は実行されずエラーを回避できます。

三つの論理演算子の優先順位

! > && > ||

数学の計算と同じく優先順位の高い演算子から計算します。計算順序を変更したい場合は () で囲みます。

if (!done && (col == 0 || col == 3)) {
  // ...何らかの処理...
}Code language: JavaScript (javascript)

計算手順:

  1. 括弧内:col == 0 || col == 3 を先に計算(列が0または3か判定)
  2. !done で否定反転
  3. 二つの結果を && で論理積演算

void main() {
  bool done = false;
  int col = 3;

  // 公式サンプル
  if (!done && (col == 0 || col == 3)) {
    print("実行ロジック:未完了、かつ列が0または3");
  }

  // 論理非 ! のデモ
  bool isFinish = true;
  print(!isFinish); // false

  // && 論理積デモ
  int a = 10, b = 20;
  if (a > 5 && b > 10) {
    print("aは5より大きく、かつbは10より大きい");
  }

  // || 論理和デモ
  int score = 55;
  if (score < 60 || score > 90) {
    print("点数が不合格、または優秀");
  }

  // 短絡評価デモ
  bool func() {
    print("関数実行");
    return true;
  }
  false && func(); // 左辺false、funcは出力されない
  true || func(); // 左辺true、funcは出力されない
}Code language: PHP (php)

実行結果

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
実行ロジック:未完了、かつ列が0または3
false
aは5より大きく、かつbは10より大きい
点数が不合格、または優秀Code language: JavaScript (javascript)

コメントを残す

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