運算子是什麼?
核心概念
「運算子(operator)」就像數學與程式裡的「動作符號」,用來對資料做計算、比較、連接或邏輯判斷。
在程式語言(這裡以 C/C++ 為例)常見的運算子大致分成:
- 算術運算子:
+ - * / %
- 關係運算子:
== != > < >= <=
- 邏輯運算子:
&& || !
- 指定(賦值)運算子:
= += -= *= /= %=
- 遞增 / 遞減運算子:
++ --
- 位元運算子:
& | ^ ~ << >>
- 條件(? :)與其他特殊運算子
想像變數是盒子,運算子就是對盒子裡數值做動作的工具:加、減、比較、判斷。
一、算術運算子(Arithmetic)
最常見的計算
算術運算子主要用在數值計算,行為和數學很像:
| 運算子 |
名稱 |
範例 |
說明 |
+ |
加法 |
a + b |
a 與 b 相加 |
- |
減法 |
a - b |
a 減去 b |
* |
乘法 |
a * b |
a 乘以 b |
/ |
除法 |
a / b |
整數除法時,小數部分會被捨去 |
% |
取餘數 |
a % b |
得到 a ÷ b 的「餘數」 |
範例:計算整數與餘數(C++ 設計風格)
// 宣告兩個整數
int a = 17;
int b = 5;
// 基本運算
int sum = a + b; // 22
int diff = a - b; // 12
int prod = a * b; // 85
int quot = a / b; // 3 (整數除法)
int rem = a % b; // 2 (餘數)
科學計算常利用 % 來做「模運算(mod)」:例如判斷「是否為偶數」可用 n % 2 == 0。
二、關係運算子(Relational)
比較大小與相等
關係運算子會產生「布林值(bool)」結果:true 或 false。
| 運算子 |
意義 |
範例(假設 a=5, b=8) |
結果 |
== |
是否相等 |
a == b |
false |
!= |
是否不相等 |
a != b |
true |
> |
大於 |
a > b |
false |
< |
小於 |
a < b |
true |
>= |
大於等於 |
a >= 5 |
true |
<= |
小於等於 |
b <= 8 |
true |
範例:使用關係運算子做條件判斷
int score = 78;
bool pass = (score >= 60); // 是否及格?
bool full = (score == 100); // 是否滿分?
bool failed = (score < 60); // 是否不及格?
很容易犯的錯:
「=」是指定,「==」才是比較相等。在條件判斷裡要用 ==。
三、邏輯運算子(Logical)
組合多個條件
邏輯運算子用來把多個「條件式」組合起來。
| 運算子 |
名稱 |
意義 |
範例(假設 A、B 為條件) |
&& |
AND(且) |
兩個都為真,結果才為真 |
A && B |
|| |
OR(或) |
至少一個為真,結果就為真 |
A || B |
! |
NOT(非) |
把真變假,把假變真 |
!A |
範例:同時檢查「年齡」與「成績」
int age = 17;
int score = 85;
// 同時滿足:年齡 >= 16 且 成績 >= 80
bool goodStudent = (age >= 16) && (score >= 80);
// 只要「年齡 >= 18」或「成績 = 100」其中一個成立
bool special = (age >= 18) || (score == 100);
// 不及格:score < 60
bool failed = !(score >= 60);
在實作「複雜條件」時,善用括號 可以讓邏輯更清楚,也避免優先順序搞混。
四、指定與複合指定運算子(Assignment)
更新變數的值
指定運算子負責把右邊的值「放到左邊的變數」裡。
| 運算子 |
意義 |
說明 |
= |
指定 |
a = 5; 表示把 5 放進 a |
+= |
加後指定 |
a += 3; 等同 a = a + 3; |
-= |
減後指定 |
a -= 2; 等同 a = a - 2; |
*= |
乘後指定 |
a *= 4; 等同 a = a * 4; |
/= |
除後指定 |
a /= 2; 等同 a = a / 2; |
%= |
取餘後指定 |
a %= 10; 等同 a = a % 10; |
範例:用複合指定做迴圈累加
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i; // 等同 sum = sum + i;
}
在演算法或競賽題中,複合指定 能讓程式更短、更好讀,也比較不容易打錯。
五、遞增 / 遞減、條件運算子與位元
進階但常用
1. 遞增 / 遞減運算子 ++、--
用來讓變數加一或減一。
| 寫法 |
名稱 |
意義(以 int a = 5; 為例) |
a++ |
後置遞增 |
先使用 a 的值,再把 a 加一 |
++a |
前置遞增 |
先把 a 加一,再使用 a 的值 |
a-- |
後置遞減 |
先使用 a 的值,再把 a 減一 |
--a |
前置遞減 |
先把 a 減一,再使用 a 的值 |
範例:前置 vs 後置
int a = 5;
int x = a++; // x = 5, a 變成 6
int y = ++a; // a 先加 1 變 7,再指定給 y,所以 y = 7
2. 條件運算子(三元運算子) ? :
可以把簡單的 if-else 寫在一行:
int score = 73;
string result = (score >= 60) ? "pass" : "fail";
// 若 score >= 60,result 為 "pass",否則為 "fail"
3. 簡介位元運算子(Bitwise)
位元運算子直接對「二進位位元」操作,在競賽與嵌入式系統常用。
| 運算子 |
名稱 |
簡單說明(以二進位為例) |
& |
AND |
兩位元都為 1,結果才為 1 |
| |
OR |
只要有一個為 1,結果為 1 |
^ |
XOR |
兩位元不同,結果為 1 |
~ |
NOT |
把 0 變 1,1 變 0(依型別長度取反) |
<< |
左移 |
整體向左移位,相當於乘上 2 的次方 |
>> |
右移 |
整體向右移位,類似除以 2 的次方 |
範例:利用位元運算設定 / 檢查旗標
unsigned int FLAG_A = 1 << 0; // 0001
unsigned int FLAG_B = 1 << 1; // 0010
unsigned int state = 0;
state |= FLAG_A; // 開啟 A
bool hasA = (state & FLAG_A); // 檢查 A 是否為 1
位元運算是許多「科學計算、競賽最佳化、嵌入式控制」的基礎,可以先理解概念,之後再搭配實作題目練習。