基礎二元算術運算子

用於兩個數值之間的運算,總共七種,包含基礎四則運算、整數除法、取餘、一元負號運算子

運算子功能說明
+加法
-減法
-運算式一元負號(取反,翻轉數值正負)
*乘法
/一般除法,運算結果永遠是 double 浮點數型別
~/整數除法,捨去小數部分,回傳 int 整數型別
%取模(取得整數除法的餘數)

其中除法的特性比較特殊,相較其他程式語言,使用 / 運算後一定會得到浮點數;如果需要整數結果,必須使用 ~/。具備開發基礎的讀者要特別留意這點。

範例程式

void main() {
        // 驗證基礎四則、整數除法、取模結果
	print(2 + 3 == 5);
	print(2 - 3 == -1);
	print(2 * 3 == 6);
	print(5 / 2 == 2.5);  // 一般除法輸出小數 double
	print(5 ~/ 2 == 2);   // 整數除法僅保留整數部分 int
	print(5 % 2 == 1);    // 取得除法餘數,% 取模運算子只會抓整數除法的餘數

	// 結合整數除法與餘數的字串拼接範例
	print('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
}Code language: Dart (dart)

執行輸出結果

遞增 / 遞減運算子

Dart 支援前置後置兩種遞增 ++、遞減 --,核心差異:變數是先修改、還是先取值

運算子執行邏輯運算式最後回傳值
++var先將變數 + 1,再參與運算遞增後的新數值
var++先拿變數原始值參與運算,運算結束後再將變數 + 1遞增前的原始數值
--var先將變數 – 1,再參與運算遞減後的新數值
var--先拿變數原始值參與運算,運算結束後再將變數 – 1遞減前的原始數值
void main() {
	int a;
	int b;

	// 1. 前置遞增 ++a:先遞增,再賦值
	a = 0;
	b = ++a;
	print(a == b); // a=1,b=1,1 == 1

	// 2. 後置遞增 a++:先賦值,再遞增
	a = 0;
	b = a++;
	print(a != b); // a=1,b=0,1 != 0

	// 3. 前置遞減 --a:先遞減,再賦值
	a = 0;
	b = --a;
	print(a == b); // a=-1,b=-1,-1 == -1

	// 4. 後置遞減 a--:先賦值,再遞減
	a = 0;
	b = a--;
	print(a != b); // a=-1,b=0,-1 != 0
}
Code language: PHP (php)

上面所有範例執行後都會輸出 true

需要注意:++ 或 — 放在前置、後置,在部分語境下執行效果完全不同。

如果單獨使用,舉例如下:

int a = 1;
++a;

int b  = 1;
b++;

print(a);
print(b);Code language: PHP (php)

這樣撰寫,最後兩者輸出都會是 2

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
2
2
Code language: CSS (css)

同理 — 也是相同邏輯,最終變數一定會加一或是減一

但如果把 ++、– 嵌入運算式當中,差異就會出現,例如:

void main() {
  int a = 5;
  // 後置:先取用 5 進行計算,計算完 a 才變成 6
  int res1 = a++ * 2;
  print(res1); // 10
  print(a);  // 6

  int b= 5;
  // 前置:先把 b 變成 6,再用 6 做運算
  int res2 = ++b * 2;
  print(res2); // 12
  print(b); // 6
}Code language: PHP (php)

範例中的 a、b 最後都增加了 1,但 res1 與 res2 的運算結果卻不一樣。只差 ++ 擺在前或後,結果就會不同。

後置寫法 a++ 的執行邏輯:先使用 a 當前數值進行後續運算,也就是先執行 a*2 = 10,此時 a 仍為 5,將結果賦值給 res1,所以 res1 等於 10;運算完畢後 a 才加一變成 6。

而前置寫法會先將 a 加一變成 6,接著執行 6*2 = 12,最後把 12 存入 res2。

int res1 = a++ * 2; 拆解後等同兩行程式:

int res1 = a * 2;
a = a +1;

int res2 = ++b * 2; 拆解後等同兩行程式:

b = b+1;
int res2 = b * 2;

方便記憶的口訣:

前置先改值,後置先取用;

前置回傳新值,後置回傳原始值。

重點總結

前置 ++a / --a先修改變數本身,再拿修改後的數值參與運算、賦值

後置 a++ / a--先取用變數原始數值參與運算、賦值,運算結束後才修改變數

讀者可以自行測試以下範例:

void main() {
  int a = 0;
  int b = ++a; 
  // 步驟1:a = a + 1 → a 變成 1
  // 步驟2:將修改後的 a(1)賦值給 b
  print(a); // 1
  print(b); // 1
}Code language: PHP (php)
void main() {
  int a = 0;
  int b = a++;
  // 步驟1:先把 a 原始值 0 賦值給 b
  // 步驟2:執行 a = a + 1 → a 變成 1
  print(a); // 1
  print(b); // 0
}Code language: PHP (php)
void main() {
  int a = 0;
  int b = --a;
  // 步驟1:a = a - 1 → a 變成 -1
  // 步驟2:將修改後的 a(-1)賦值給 b
  print(a); // -1
  print(b); // -1
}Code language: PHP (php)
void main() {
  int a = 0;
  int b = a--;
  // 步驟1:先把 a 原始值 0 賦值給 b
  // 步驟2:執行 a = a - 1 → a 變成 -1
  print(a); // -1
  print(b); // 0
}Code language: PHP (php)

以上是 ++、– 前置與後置最基礎的示範,讀者可以自行編譯執行,觀察兩者的差異。

發佈留言

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