運算子(Operators)

Dart 支援下表列出的所有運算子,表格依照優先權由高至低排序

分類說明運算子結合性
一元後置運算子expr++ expr-- () [] ?[] . ?. !
一元前置運算子- expr ! expr ~ expr ++ expr -- expr await expr
乘除運算* / % ~/左結合
加減運算+ -左結合
移位運算<< >> >>>左結合
位元與&左結合
位元互斥或^左結合
位元或|左結合
關係與型別偵測>= > <= < as is is!
相等判斷== !=
邏輯與&&左結合
邏輯或||左結合
空值合併運算子??左結合
三元條件運算子expr1 ? expr2 : expr3右結合
串聯運算子.. ?..左結合
賦值運算子= *= /= += -= &= ^=右結合
展開運算子(備註說明)... ...?

透過以上運算子搭配運算元,就能組成運算式

舉例:

a++
a + b
a = b
a == b
c ? a : b
a is T

以下是完整實作範例

void main() {
  // 1. 後置遞增運算式 a++
  int a = 10;
  print("1. 後置遞增 a++");
  print("遞增前 a = $a");
  int temp = a++; // 先取值,後遞增
  print("temp(取出的原值)= $temp");
  print("遞增後 a = $a\n");

  // 2. 加法運算式 a + b
  int b = 20;
  int sum = a + b;
  print("2. 加法 a + b");
  print("$a + $b = $sum\n");

  // 3. 賦值運算式 a = b
  a = b;
  print("3. 賦值 a = b");
  print("賦值後 a = $a\n");

  // 4. 相等判斷運算式 a == b
  bool isEqual = a == b;
  print("4. 相等判斷 a == b");
  print("a == b 的結果:$isEqual\n");

  // 5. 三元條件運算式 c ? a : b
  int c = 5;
  String result = c > 0 ? "c 是正數" : "c 是負數或零";
  print("5. 三元運算式 c ? a : b");
  print("判斷 c>0:$result\n");

  // 6. 型別偵測運算式 a is T
  dynamic testVal = 100;
  print("6. 型別偵測 a is T");
  print("testVal is int:${testVal is int}");
  print("testVal is String:${testVal is String}");
}
Code language: Dart (dart)

你可以複製上方程式碼,執行 dart run 觀察輸出結果

運算子優先權核心規則

1. 優先權排序邏輯

運算子表格由上到下優先權逐層遞減:表格上方列的運算子優先權高於下方所有列,會優先執行。

補充:下方的「>」代表優先順序先執行,不是大小比較運算子。

執行順序範例:取模 % > 相等判斷 == > 邏輯與 &&

拆解運算式執行流程(n % i == 0 && d % i == 0):

  1. 先執行 n % id % i% 優先權最高)
  2. 接著執行兩個 == 相等比較
  3. 最後執行中間的 && 邏輯與
2 括號的作用

加上括號 ((n % i == 0) && (d % i == 0))僅提升程式可讀性,不會改變原本的運算順序;

不帶括號寫法 n % i == 0 && d % i == 0:依靠原生優先權自動運算,兩段程式邏輯、執行結果完全相同;

補充:只有需要打破預設優先權時,括號才會改變執行順序。

void main() {
  int n = 10;
  int d = 20;
  int i = 2;

  // 寫法1:加上括號,可讀性更高
  if ((n % i == 0) && (d % i == 0)) {
    print("寫法1:可整除");
  }

  // 寫法2:不帶括號,依優先權自動運算,效果完全一致
  if (n % i == 0 && d % i == 0) {
    print("寫法2:可整除");
  }
}Code language: PHP (php)

執行輸出結果

寫法1:可整除
寫法2:可整除

發佈留言

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