逻辑运算只处理布尔值(true /false),用来判断「条件成立与否」,最终结果只有两种:true(真,条件满足)、false(假,条件不满足)。
代码里所有 if、while for循环判断、开关条件,底层全靠逻辑运算实现。
主要有三种:与或非
| 运算符 | 名称 | 作用说明 |
|---|---|---|
&& | 逻辑与 | 两边同时为true,整体结果才是true;短路运算 |
| || | 逻辑或 | 任意一边为true,整体结果就是true;短路运算 |
!expr | 逻辑非(取反) | 布尔值反转:true变false,false变true |
与或非,和中学学过的并联电路串联电路类似。串联电路就是与,并联电路就是或。
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 && true | true |
true && false | false |
false && true | false |
false && false | false |
两边全为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 || true | true |
| true || false | true |
| false || true | true |
| false || false | false |
看一个例子
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)
分步计算顺序:
- 括号内:
col == 0 || col == 3先算(判断列是 0 或 3) !done取反- 两者做
&&运算
例子
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)