Dart 逻辑运算符

逻辑运算只处理布尔值(true /false),用来判断「条件成立与否」,最终结果只有两种:true(真,条件满足)、false(假,条件不满足)。

代码里所有 if、while for循环判断、开关条件,底层全靠逻辑运算实现。

主要有三种:与或非

运算符名称作用说明
&&逻辑与两边同时为true,整体结果才是true;短路运算
||逻辑或任意一边为true,整体结果就是true;短路运算
!expr逻辑非(取反)布尔值反转:truefalsefalsetrue

与或非,和中学学过的并联电路串联电路类似。串联电路就是与,并联电路就是或。

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里面有错误异常,也不会报错,因为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,灯泡就亮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

提升运行效率,还能规避报错(空值判断常用)

例如:

String? name;
// name不为null才调用length,短路避免空报错
if(name != null && name.length > 0) 
{

}Code language: JavaScript (javascript)

以上代码,如果直接执行name.length 会报错,因为name是null,无法访问它的属性length。但是由于前面判断了name != null 这个时候,因为name是null 所以第一个条件就是false 这个时候 就不会执行后面的,所以不会报错。

三个逻辑运算符的优先级

! > && > ||

和数学运算一样,优先级高的先算;需要改变顺序用 () 包裹。

if (!done && (col == 0 || col == 3)) {
  // ...Do something...
}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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注