Dart 邏輯運算子

邏輯運算僅處理布林值(true / false),用來判斷「條件是否成立」,運算結果只有兩種:true(真,條件符合)、false(假,條件不符合)。

程式裡所有 if、while、for 迴圈判斷、switch 條件,底層都是透過邏輯運算實作。

共有三種:邏輯且、邏輯或、邏輯非

運算子名稱功能說明
&&邏輯且兩側運算式皆為true,整體結果才是true;具備短路特性
||邏輯或任一側運算式為true,整體結果即為true;具備短路特性
!運算式邏輯非(反向取反)布林值反向:true轉為falsefalse轉為true

邏輯且、或、非的概念,和國中物理學的串聯、並聯電路很類似。串聯電路等同邏輯且,並聯電路等同邏輯或。

1. 邏輯非 !

針對單一布林運算式做反向取反。

使用語法:

!布林運算式

範例

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

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

範例中 isMale 原本是 false、flag 原本是 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';

  // && 兩側條件都符合才會成立
  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)) {
  // ...執行對應邏輯...
}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)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *