運算子指示編譯器執行特定數學/邏輯操作。C++ 內建豐富運算子,分六大類。
| 類別 | 代表運算子 |
|---|---|
| 算術 | + - * / % ++ -- |
| 關係 | == != > < >= <= |
| 邏輯 | && || ! |
| 位元 | & | ^ ~ << >> |
| 指派 | = += -= *= /= %= &= ^= |= <<= >>= |
| 雜項 | sizeof ?: , . -> (cast) & * |
支援整數與浮點數。% 僅適用整數。++/-- 分前置(回傳修改後值)與後置(回傳修改前值),前置效能略優(無需建立暫時物件)。
回傳 bool (true/false)。鏈式比較 a < b < c 在 C++ 中不按數學意義,實為 (a < b) < c(bool 轉 int 比較),請改用 a < b && b < c。
&& (AND):短路求值,左側為假則不評估右側。|| (OR):短路求值,左側為真則不評估右側。! (NOT):邏輯反轉。短路特性常用於防禦性程式設計:if (ptr && ptr->valid())。
作用於整數位元層級。真值表:
| p | q | p&q | p|q | p^q |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
常見技巧:
x & 1 判斷奇偶x & (x-1) 清除最低位 11 << n 產生第 n 位掩碼x | mask 設位、x & ~mask 清位、x ^ mask 翻位op= 等價 x = x op y,但 x 僅評估一次(對複雜左值如 arr[i++] 有差異)。
sizeof:編譯期取得型別/運算式大小(位元組),非函式。?::條件運算子,唯一三元運算子,右結合。,:逗號運算子,依序評估,回傳最右運算式值。./->:成員存取(物件/指標)。(type):C 風格強制轉型(建議改用 C++ 風格 static_cast 等)。&/*:取址/解參考(指標操作)。| 優先序 | 運算子 | 結合性 |
|---|---|---|
| 1 | () [] -> . ++ -- (後置) | 左→右 |
| 2 | ++ -- + - ! ~ (type) * & sizeof (一元) | 右→左 |
| 3 | * / % | 左→右 |
| 4 | + - | 左→右 |
| 5 | << >> | 左→右 |
| 6 | < <= > >= | 左→右 |
| 7 | == != | 左→右 |
| 8 | & | 左→右 |
| 9 | ^ | 左→右 |
| 10 | | | 左→右 |
| 11 | && | 左→右 |
| 12 | || | 左→右 |
| 13 | ?: | 右→左 |
| 14 | = += -= *= /= %= &= ^= |= <<= >>= | 右→左 |
| 15 | , | 左→右 |
int a=20, b=10, c=15, d=5, e;
e = (a + b) * c / d; // (30*15)/5 = 90
e = ((a + b) * c) / d; // 同前,90
e = (a + b) * (c / d); // 30*(15/5) = 90
e = a + (b * c) / d; // 20 + (150/5) = 50
括號明確分組 是避免優先序錯誤的最佳實務。
C++ 允許為使用者定義型別多載多數運算子(除 .: ?: sizeof :: .* ),語法:
class Complex {
double re, im;
public:
Complex operator+(const Complex& rhs) const {
return Complex(re + rhs.re, im + rhs.im);
}
};
多載應保持語意直觀(+ 做加法、== 做相等比較),避免濫用導致程式碼難懂。
const 正確性。