首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 基礎入門(四):深入理解運算子與操作符

     編輯:關於C++

在掌握了變數與常數的基本概念後,我們便可以開始對它們進行各種操作,這就需要用到 C++ 的運算子。與某些程式語言使用關鍵字(如 add、equals)來表示操作不同,C++ 的運算子主要由符號組成。這些符號雖不在字母表中,卻能在所有鍵盤上找到,這一特性使得 C++ 程式碼更加簡潔,也更具國際化優勢。運算子是 C++ 語言的基石,掌握它們至關重要。

您無須死記硬背本節所有內容,這些細節知識僅供日後查閱參考。

指派運算子

指派運算子的功能是將一個值賦予給一個變數。

a = 5;

此行程式碼將整數 5 指派給變數 a。等號左側稱為 lvalue(左值),右側稱為 rvalue(右值)。左值必須是一個變數,而右值可以是常數、變數、一個運算式的結果,或是它們的任意組合。務必牢記:指派運算永遠是將右側的值賦予左側,絕不會反向進行。

a = b;

這將變數 b(右值)的值賦予給變數 a(左值),無論 a 原本儲存何值。由於只是複製數值,後續 b 的變動不會影響 a。

範例:變數值的變化過程

// 指派運算子範例
#include 
using 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++ 獨特的鏈式指派特性

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;
A = ++B;
// A=4, B=4
B = 3;
A = B++;
// A=3, B=4

範例 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 等),將在後續章節介紹。

sizeof 運算子

回傳型別或物件所佔記憶體位元組數(char 通常為 1)。其值為編譯期常數。

a = sizeof(char); // 回傳 1

運算子優先序與結合性

複雜運算式中,優先序決定運算順序。例如 a = 5 + 7 % 2 中,% 優先於 +,故等同於 a = 5 + (7 % 2),結果為 6。若不確定優先序,建議善用括號 () 明確指定順序,同時提升程式碼可讀性。

完整優先序表(由高到低):

  1. ::(範圍解析)
  2. () [] . -> ++ -- dynamic_cast ...(後綴)
  3. ++ -- ~ ! sizeof new delete(一元/前綴)
  4. (type)(型別轉換)
  5. .* ->*(成員指標)
  6. * / %(乘除模)
  7. + -(加減)
  8. << >>(位移)
  9. < > <= >=(關係)
  10. == !=(等值)
  11. &(位元與)
  12. ^(位元異或)
  13. |(位元或)
  14. &&(邏輯與)
  15. ||(邏輯或)
  16. ?:(條件)
  17. = *= /= %= += -= >>= <<= &= ^= |=(指派)
  18. ,(逗號)

同優先序運算子的結合方向(左向右或右向左)決定了多個同級運算子連續出現時的運算順序。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved