在掌握了變數與常數的基本概念後,我們便可以開始對它們進行各種操作,這就需要用到 C++ 的運算子。與某些程式語言使用關鍵字(如 add、equals)來表示操作不同,C++ 的運算子主要由符號組成。這些符號雖不在字母表中,卻能在所有鍵盤上找到,這一特性使得 C++ 程式碼更加簡潔,也更具國際化優勢。運算子是 C++ 語言的基石,掌握它們至關重要。
您無須死記硬背本節所有內容,這些細節知識僅供日後查閱參考。
指派運算子的功能是將一個值賦予給一個變數。
a = 5;
此行程式碼將整數 5 指派給變數 a。等號左側稱為 lvalue(左值),右側稱為 rvalue(右值)。左值必須是一個變數,而右值可以是常數、變數、一個運算式的結果,或是它們的任意組合。務必牢記:指派運算永遠是將右側的值賦予左側,絕不會反向進行。
a = b;
這將變數 b(右值)的值賦予給變數 a(左值),無論 a 原本儲存何值。由於只是複製數值,後續 b 的變動不會影響 a。
// 指派運算子範例 #includeusing namespace std; int main() { int a, b; // a:?, b:? a = 10; // a:10, b:? b = 4; // a:10, b:4 a = b; // a:4, b:4 b = 7; // a:4, b:7 cout << "a:" << a << " b:" << b; return 0; }
執行結果:a:4 b:7。最後修改 b 的值並未影響 a,這驗證了「由右至左」的指派規則。
C++ 允許將指派運算子 = 的結果作為另一個指派運算的右值。例如:
a = 2 + (b = 5);
等同於:
b = 5;
a = 2 + b;
意即:先將 5 指派給 b,再將該指派運算的結果(即 5)加 2 後指派給 a,最終 a 為 7。因此,下列鏈式指派在 C++ 中完全合法:
a = b = c = 5; // 將 5 同時指派給 a、b、c 三個變數
C++ 支援五種基本算術運算子:
+ 加法- 減法* 乘法/ 除法% 餘數(模數運算)前四者與數學運算無異。唯一可能較陌生的是 %(模數運算),它用於取得兩個整數相除的餘數。例如 a = 11 % 3; 會使 a 的值為 2,因為 11 除以 3 餘 2。
C++ 以簡潔著稱,複合指派運算子(+=, -=, *=, /=, %= 等)便是一大特色,它們能以單一運算子完成運算並指派回變數:
value += increase; 等同於 value = value + increase;a -= 5; 等同於 a = a - 5;a /= b; 等同於 a = a / b;price *= units + 1; 等同於 price = price * (units + 1);++(遞增)與 --(遞減)分別使變數值加 1 或減 1,等同於 +=1 與 -=1。早期 C 編譯器對這三種寫法產生不同機器碼且效能各異,但現代編譯器已自動優化,實際執行效能基本一致。
這兩個運算子可用作前綴(++a)或後綴(a++)。在獨立陳述式中兩者效果相同,但若運算結果直接參與其他運算,行為截然不同:
| 範例 1:前綴 | 範例 2:後綴 |
|---|---|
B = 3; | B = 3; |
範例 1 中,B 在指派給 A 前先加 1;範例 2 中,B 原值 3 指派給 A 後,B 才變為 4。
用於比較兩個運算式,結果為 bool 型別(true 或 false)。
| 運算子 | 含義 |
|---|---|
== | 相等 |
!= | 不等 |
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
陷阱警示:=(單等號)是指派運算子,==(雙等號)才是比較運算子。切勿混淆。
!:邏輯非,反轉運算元的真偽值。&&:邏輯且,兩運算元皆為真才回傳真。||格式:condition ? result1 : result2。若條件為真,回傳 result1,否則回傳 result2。
7 == 5 ? 4 : 3 // 回傳 3
7 == 5+2 ? 4 : 3 // 回傳 4
5 > 3 ? a : b // 回傳 a
a > b ? a : b // 回傳 a、b 中較大者
用於分隔多個運算式,僅回傳最右側運算式的值。例如:
a = (b = 3, b + 2);
先將 3 指派給 b,再將 b+2(即 5)指派給 a。最終 a=5,b=3。
直接操作變數的二進制位元:
| 運算子 | 助憶符 | 說明 |
|---|---|---|
& | AND | 邏輯與 |
| | OR | 邏輯或 |
^ | XOR | 邏輯異或 |
~ | NOT | 位元取補(反轉) |
<< | SHL | 左移 |
>> | SHR | 右移 |
將一種資料型別轉換為另一種。常見兩種寫法:
// C 風格
int i;
float f = 3.14;
i = (int) f; // i 變為 3
// C++ 颎構函數風格
i = int(f); // 效果相同
ANSI C++ 針對物件導向另增添了進階型別轉換運算子(如 dynamic_cast 等),將在後續章節介紹。
回傳型別或物件所佔記憶體位元組數(char 通常為 1)。其值為編譯期常數。
a = sizeof(char); // 回傳 1
複雜運算式中,優先序決定運算順序。例如 a = 5 + 7 % 2 中,% 優先於 +,故等同於 a = 5 + (7 % 2),結果為 6。若不確定優先序,建議善用括號 () 明確指定順序,同時提升程式碼可讀性。
完整優先序表(由高到低):
::(範圍解析)() [] . -> ++ -- dynamic_cast ...(後綴)++ -- ~ ! sizeof new delete(一元/前綴)(type)(型別轉換).* ->*(成員指標)* / %(乘除模)+ -(加減)<< >>(位移)< > <= >=(關係)== !=(等值)&(位元與)^(位元異或)|(位元或)&&(邏輯與)||(邏輯或)?:(條件)= *= /= %= += -= >>= <<= &= ^= |=(指派),(逗號)同優先序運算子的結合方向(左向右或右向左)決定了多個同級運算子連續出現時的運算順序。