基礎程式設計(5)-運算子

程式設計可說是數學的應用,利用變數的運算與傳遞來達到我們的目的。雖然程式設計師的目標是要讓電腦幫人運算複雜的算式,但是如果自己不會算,程式出錯時就會找不到錯在那裡了。總而言之,程式和數學的關係是密不可分的。

學習數學的時候,相信老師們都會告訴我們:辨別數學符號很重要。要知道數學符號代表的意義,才會知道數學算式的作用。程式設計使用的數學符號,例如加、減、乘、除…等等,稱作「運算子(Operator)」,不過這裡頭有很多是數學裡沒有的運算子。本篇要介紹的就是程式運算子的意義,以及不同程式的語法。

算術運算子(Arithmetic Operators)

算術運算子大部份都是常用的數學運算,所以運算的對象通常是數字。

名稱 C/C++ Java 說明與範例
負號 - -3
加法 + 1 + 1 = 2
減法 - 5 - 3 = 2
乘法 * 3 * 2 = 6
除法 / 7 / 2 = 3.33333
商數 7 \ 2 = 3
整數除法,當被除數無法整除時,只留下商數。
餘數 % 7 % 2 = 1
整數除法,只留下餘數。可整除時餘數為0。
遞增 ++ A++:算式結束後把目前變數 A 的值 +1。
A = 10; print(A++); //印出 A = 10
++A:在執行算式之前把目前變數 A 的值 +1。
A = 10; print(++A); //印出 A = 11
遞減 -- A--:算式結束後把目前變數 A 的值 -1。
A = 10; print(A--); //印出 A = 10
--A:在執行算式之前把目前變數 A 的值 -1。
A = 10; print(--A); //印出 A = 9

關係/比較運算子(Relational/Comparison Operators)

關係運算子就是數學裡的大於小於,是用來確認二個數字之間的關係,結果會產生 true/false 的布林值

名稱 C/C++ Java 範例 結果
等於 == 1 = 2 false
3 = 3 true
不等於 != 2≠2 false
3≠5 true
大於 > 5>3 true
2>2 false
大於等於 >= 4≧8 false
6≧6 true
小於 < 5<8 true
9<3 false
小於等於 <= 4≦8 true
7≦3 false

邏輯運算子(Logical Operators)

在講運算子之前,要先”複習”一下邏輯運算的概念。布林值有分成 true(真) 和 false(假),邏輯運算常用 1 代表 true,0 代表false。

x y NOT x x AND y x OR y x XOR y
true(1) true(1) false(0) true(1) true(1) false(0)
true(1) false(0) false(0) false(0) true(1) true(1)
false(0) true(1) true(1) false(0) true(1) true(1)
false(0) false(0) true(1) false(0) false(0) false(0)

邏輯運算子通常是用來連結關係運算子,就像英文的連接詞 and/or 連接兩個句子一般。它是針對關係運算後產生的布林值進行運算,運算方法和邏輯運算相同。

名稱 C/C++ Java 範例 說明
NOT ! ! NOT(5 > 3) = false 傳回和原本運算相反的布林值。
AND && && (8 > 3) AND (1 < 7) = true
(6 > 3) AND (8 < 2) = false
當左右兩邊都是 true 時,結果為 true。
OR || || (9 >= 3) OR (3 > 4) = true 左右兩邊只要有一個 true,結果為 true。
XOR ^ (8 > 3) XOR (1 < 7) = false
(6 > 3) XOR (8 < 2) = true
左右兩邊的布林值不同時為 true,相同則為 false。

位元運算子(Shift and Bitwise Operators)

位元運算子是針對二進位進行移動或邏輯運算。程式有使用二進位時才會需要。

名稱 C/C++ Java 範例 說明
補數運算 ~ ~ NOT(0110) = (1001) 將 0 變成 1;1 變成 0。
左移運算 << << (0010) << 2 = (1000) 將原本的位元左移 n 位之後,左側溢出的丟棄,右邊補 0。
維持符號右移 >> >> (1010) >> 1 = (1101) 將原本的位元右移 n 位之後,右側溢出的丟棄,左邊根據原來的符號填入 0 或 1。
無號右移 >>> (1001) >>> 1 = (0100) 將原本的位元右移 n 位之後,右側溢出的丟棄,左邊補 0。
AND運算 & & (0010) AND (0011) = (0010) 左右兩數相同位數同樣是 1 的位元維持在 1,其餘為 0。
OR運算 | | (0011) OR (0110) = (0111) 左右兩數相同位數只要有一個位元是 1 則為 1。
XOR運算 ^ ^ (0011) XOR (0110) = (0101) 左右兩數相同位數不同值則為 1,同值為 0。

指定運算子(Assignment Operators)

在「變數宣告」時有提到「=」符號是指定的意思,除此之外還有很多簡化算式用的指定運算子。

名稱 C/C++ Java 範例 相當的算式
指定 = =
加法指定 += += x += y x = x + y
減法指定 -= -= x -= y x = x - y
乘法指定 *= *= x *= y x = x * y
除法指定 /= /= x /= y x = x / y
餘數指定 %= %= x %= y x = x % y
左移指定 <<= <<= x <<= y x = x << y
右移指定 >>= >>= x >>= y x = x >> y
無號右移指定 >>>= x >>>= y x = x >>> y
AND指定 &= &= x &= y x = x & y
OR指定 |= &= x |= y x = x | y
XOR指定 ^= ^= x ^= y x = x ^ y

運算子的優先順序

學數學的時候我們都知道要先乘除後加減,當程式的運算子混在一起的時候,也有優先順序的問題。

順序 運算子 說明
1 () 括號
2 !、-、++、-- 邏輯運算子NOT、負號、遞增、遞減
3 *、/、% 乘法、除法、商數、餘數
4 +、- 加法、減法
5 <<、>>、>>> 位元運算子左移、右移
6 >、>=、<、<= 關係運算子大於、小於
7 ==、!= 關係運算子等於、不等於
8 & 位元運算子AND
9 ^ 位元運算子XOR
10 | 位元運算子OR
11 && 邏輯運算子AND
12 || 邏輯運算子OR
13 ?: 條件控制運算子
14 =、op= 指定運算子