C++ 運算符


運算子是一種告訴編譯器執行特定的數學或邏輯運算的符號。 C++ 內建了豐富的運算符,並提供了以下類型的運算子:

  • #算術運算子

  • ##關係運算子

  • #邏輯運算子

  • 位元運算子

  • #賦值運算子

  • #雜項運算子

本章將逐一介紹算術運算子、關係運算子、邏輯運算子、位元運算子、賦值運算子和其他運算子。

算術運算子

下表顯示了 C++ 支援的算術運算子。

假設變數A 的值為10,變數B 的值為20,則:#運算子描述實例+把兩個運算元相加A + B 將會得到30-從第一個運算元中減去第二個運算元A - B 將會得到-10 *把兩個運算元相乘A * B 將得到200/分子除以分母B / A 將得到2%#取模運算符,整除後的餘數B % A 將得到0++自增運算符,整數值增加1A++ 將得到11--自減運算符,整數值減少1A-- 將得到9
##

實例

請看下面的實例,了解 C++ 中可用的算術運算子。

複製並貼上下面的 C++ 程式到 test.cpp 檔案中,編譯並執行程式。

#include <iostream>
using namespace std;
 
main()
{
   int a = 21;
   int b = 10;
   int c ;
 
   c = a + b;
   cout << "Line 1 - c 的值是 " << c << endl ;
   c = a - b;
   cout << "Line 2 - c 的值是 " << c << endl ;
   c = a * b;
   cout << "Line 3 - c 的值是 " << c << endl ;
   c = a / b;
   cout << "Line 4 - c 的值是 " << c << endl ;
   c = a % b;
   cout << "Line 5 - c 的值是 " << c << endl ;
   c = a++; 
   cout << "Line 6 - c 的值是 " << c << endl ;
   c = a--; 
   cout << "Line 7 - c 的值是 " << c << endl ;
   return 0;
}

當上面的程式碼被編譯和執行時,它會產生以下結果:

Line 1 - c 的值是 31
Line 2 - c 的值是 11
Line 3 - c 的值是 210
Line 4 - c 的值是 2
Line 5 - c 的值是 1
Line 6 - c 的值是 21
Line 7 - c 的值是 22

關係運算子

下表顯示了 C++ 支援的關係運算子。

假設變數A 的值為10,變數B 的值為20,則:

#運算子描述 實例
==檢查兩個運算元的值是否相等,如果相等則條件為真。 (A == B) 不為真。
!=檢查兩個運算元的值是否相等,如果不相等則條件為真。 (A != B) 為真。
>檢查左運算元的值是否大於右邊運算元的值,如果是則條件為真。 (A > B) 不為真。
<檢查左運算元的值是否小於右邊運算元的值,如果是則條件為真。 (A < B) 為真。
>=檢查左運算元的值是否大於或等於右運算元的值,如果是則條件為真。 (A >= B) 不為真。
<=檢查左運算元的值是否小於或等於右邊運算元的值,如果是則條件為真。 (A <= B) 為真。

實例

請看下面的實例,了解 C++ 中可用的關係運算子。

複製並貼上下面的 C++ 程式到 test.cpp 檔案中,編譯並執行程式。

#include <iostream>
using namespace std;

main()
{
   int a = 21;
   int b = 10;
   int c ;

   if( a == b )
   {
      cout << "Line 1 - a 等于 b" << endl ;
   }
   else
   {
      cout << "Line 1 - a 不等于 b" << endl ;
   }
   if ( a < b )
   {
      cout << "Line 2 - a 小于 b" << endl ;
   }
   else
   {
      cout << "Line 2 - a 不小于 b" << endl ;
   }
   if ( a > b )
   {
      cout << "Line 3 - a 大于 b" << endl ;
   }
   else
   {
      cout << "Line 3 - a 不大于 b" << endl ;
   }
   /* 改变 a 和 b 的值 */
   a = 5;
   b = 20;
   if ( a <= b )
   {
      cout << "Line 4 - a 小于或等于 b" << endl ;
   }
   if ( b >= a )
   {
      cout << "Line 5 - b 大于或等于 a" << endl ;
   }
   return 0;
}

當上面的程式碼被編譯和執行時,它會產生以下結果:

Line 1 - a 不等于 b
Line 2 - a 不小于 b
Line 3 - a 大于 b
Line 4 - a 小于或等于 b
Line 5 - b 大于或等于 a

邏輯運算子

下表顯示了C++ 支援的關係邏輯運算符。

假設變數A 的值為1,變數B 的值為0,則:

運算子描述 實例
&&#稱為邏輯與運算子。如果兩個操作數都非零,則條件為真。 (A && B) 為假。
||稱為邏輯或運算子。如果兩個操作數中有任一個非零,則條件為真。 (A || B) 為真。
!稱為邏輯非運算子。用來逆轉操作數的邏輯狀態。如果條件為真則邏輯非運算子將使其為假。 !(A && B) 為真。

實例

請看下面的實例,了解 C++ 中可用的邏輯運算子。

複製並貼上下面的 C++ 程式到 test.cpp 檔案中,編譯並執行程式。

#include <iostream>
using namespace std;

main()
{
   int a = 5;
   int b = 20;
   int c ;

   if ( a && b )
   {
      cout << "Line 1 - 条件为真"<< endl ;
   }
   if ( a || b )
   {
      cout << "Line 2 - 条件为真"<< endl ;
   }
   /* 改变 a 和 b 的值 */
   a = 0;
   b = 10;
   if ( a && b )
   {
      cout << "Line 3 - 条件为真"<< endl ;
   }
   else
   {
      cout << "Line 4 - 条件不为真"<< endl ;
   }
   if ( !(a && b) )
   {
      cout << "Line 5 - 条件为真"<< endl ;
   }
   return 0;
}

當上面的程式碼被編譯和執行時,它會產生以下結果:

Line 1 - 条件为真
Line 2 - 条件为真
Line 4 - 条件不为真
Line 5 - 条件为真

位元運算子

位元運算子作用於位,並逐位執行操作。 &、 | 與^ 的真值表如下:

##0#0010#1111#010011
pqp & q# #p | qp ^ q
0#00
##11

#假設如果A = 60,且B = 13,現在以二進位格式表示,它們如下所示:

A = 0011 1100

B = 0000 1101

#---------- -------

A&B = 0000 1100

##A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

#~A  = 1100 0011下表顯示了C++ 支援的位元運算子。假設變數A 的值為60,變數B 的值為13,則:運算子實例(A & B) 將得到12,即為0000 1100(A | B) 將會得到61,也就是0011 1101(A ^ B) 將得到49,即為0011 0001(~A ) 將得到 -61,即為 1100 0011,2 的補碼形式,帶符號的二進制數。 A << 2 將得到 240,即為 1111 0000A >> 2 將得到 15,即為 0000 1111
##描述
&如果同時存在於兩個運算元中,二進位AND 運算子複製一位到結果中。
|如果存在於任一操作數中,二進位OR 運算符複製一位到結果中。
^如果存在於其中一個運算元中但不同時存在於兩個運算元中,二進位異或運算子複製一位到結果中。
~二進位補碼運算子是一元運算符,具有"翻轉"位效果。
<<二進位左移運算子。左操作數的值向左移動右操作數所指定的位數。
>>#二進位右移運算子。左操作數的值向右移動右操作數所指定的位數。
######

實例

請看下面的實例,了解 C++ 中可用的位元運算子。

複製並貼上下面的 C++ 程式到 test.cpp 檔案中,編譯並執行程式。

#include <iostream>
using namespace std;

main()
{
   unsigned int a = 60;	  // 60 = 0011 1100  
   unsigned int b = 13;	  // 13 = 0000 1101
   int c = 0;           

   c = a & b;             // 12 = 0000 1100
   cout << "Line 1 - c 的值是 " << c << endl ;

   c = a | b;             // 61 = 0011 1101
   cout << "Line 2 - c 的值是 " << c << endl ;

   c = a ^ b;             // 49 = 0011 0001
   cout << "Line 3 - c 的值是 " << c << endl ;

   c = ~a;                // -61 = 1100 0011
   cout << "Line 4 - c 的值是 " << c << endl ;

   c = a << 2;            // 240 = 1111 0000
   cout << "Line 5 - c 的值是 " << c << endl ;

   c = a >> 2;            // 15 = 0000 1111
   cout << "Line 6 - c 的值是 " << c << endl ;

   return 0;
}

當上面的程式碼被編譯和執行時,它會產生以下結果:

Line 1 - c 的值是 12
Line 2 - c 的值是 61
Line 3 - c 的值是 49
Line 4 - c 的值是 -61
Line 5 - c 的值是 240
Line 6 - c 的值是 15

賦值運算子

下表列出了C++ 支援的賦值運算符:

##=簡單的賦值運算符,把右邊運算元的值賦給左邊運算元C = A + B 會把A + B 的值賦給C +=加上且賦值運算符,把右邊運算元加上左邊運算元的結果賦值給左邊運算元C += A 相當於C = C + A-=減且賦值運算符,把左邊運算元減去右邊運算元的結果賦值給左邊運算元C -= A 相當於C = C - A*=乘且賦值運算符,把右邊運算元乘以左邊運算元的結果賦值給左邊運算元C *= A 相當於C = C * A/=#且賦值運算符,將左邊運算元除以右邊運算元的結果賦值給左邊運算元C /= A 相當於C = C / A#%=求模且賦值運算符,求兩個運算元的模賦值給左邊運算元C %= A 相當於C = C % A<<=##>>=右移且賦值運算子C >>= 2 等同於 C = C >> 2&=按位元與且賦值運算子C &= 2 等同於 C = C & 2^=以位元異或且賦值運算符C ^= 2 等同於 C = C ^ 2#|=位元或且賦值運算子 #C |= 2 等同於 C = C | 2

實例

請看下面的實例,了解 C++ 中可用的賦值運算子。

複製並貼上下面的 C++ 程式到 test.cpp 檔案中,編譯並執行程式。

#include <iostream>
using namespace std;

main()
{
   int a = 21;
   int c ;

   c =  a;
   cout << "Line 1 - =  运算符实例,c 的值 = : " <<c<< endl ;

   c +=  a;
   cout << "Line 2 - += 运算符实例,c 的值 = : " <<c<< endl ;

   c -=  a;
   cout << "Line 3 - -= 运算符实例,c 的值 = : " <<c<< endl ;

   c *=  a;
   cout << "Line 4 - *= 运算符实例,c 的值 = : " <<c<< endl ;

   c /=  a;
   cout << "Line 5 - /= 运算符实例,c 的值 = : " <<c<< endl ;

   c  = 200;
   c %=  a;
   cout << "Line 6 - %= 运算符实例,c 的值 = : " <<c<< endl ;

   c <<=  2;
   cout << "Line 7 - <<= 运算符实例,c 的值 = : " <<c<< endl ;

   c >>=  2;
   cout << "Line 8 - >>= 运算符实例,c 的值 = : " <<c<< endl ;

   c &=  2;
   cout << "Line 9 - &= 运算符实例,c 的值 = : " <<c<< endl ;

   c ^=  2;
   cout << "Line 10 - ^= 运算符实例,c 的值 = : " <<c<< endl ;

   c |=  2;
   cout << "Line 11 - |= 运算符实例,c 的值 = : " <<c<< endl ;

   return 0;
}

當上面的程式碼被編譯和執行時,它會產生以下結果:

Line 1 - =  运算符实例,c 的值 = 21
Line 2 - += 运算符实例,c 的值 = 42
Line 3 - -= 运算符实例,c 的值 = 21
Line 4 - *= 运算符实例,c 的值 = 441
Line 5 - /= 运算符实例,c 的值 = 21
Line 6 - %= 运算符实例,c 的值 = 11
Line 7 - <<= 运算符实例,c 的值 = 44
Line 8 - >>= 运算符实例,c 的值 = 11
Line 9 - &= 运算符实例,c 的值 = 2
Line 10 - ^= 运算符实例,c 的值 = 0
Line 11 - |= 运算符实例,c 的值 = 2

雜項運算子

下表列出了C++ 支援的其他一些重要的運算符。

運算子描述#實例
##左移且賦值運算子C <<= 2 等同於 C = C << 2
運算子描述
#sizeofsizeof 運算子傳回變數的大小。例如,sizeof(a) 將傳回 4,其中 a 是整數。
Condition ? X : Y條件運算子。如果 Condition 為真 ? 則值為 X : 否則值為 Y。
,逗號運算子會順序執行一系列運算。整個逗號表達式的值是以逗號分隔的清單中的最後一個表達式的值。
.(點)和  ->(箭頭)成員運算子用於引用類別、結構和共用體的成員。
Cast強制轉換運算子把一種資料型別轉換為另一種資料型別。例如,int(2.2000) 將傳回 2。
&指標運算子 & 傳回變數的位址。例如 &a; 將給出變數的實際位址。
*指標運算子 * 指向一個變數。例如,*var; 將指向變數 var。

C++ 中的運算子優先權

運算子的優先權決定表達式中項的組合。這會影響到一個表達式如何計算。某些運算子比其他運算子有更高的優先級,例如,乘除運算子具有比加減運算子更高的優先權。

例如x = 7 + 3 * 2,在這裡,x 被賦值為13,而不是20,因為運算子* 具有比+ 更高的優先權,所以首先計算乘法3*2,然後再加上7。

下表將按運算子優先權從高到低列出各個運算符,具有較高優先權的運算子出現在表格的上面,具有較低優先權的運算子出現在表格的下面。在表達式中,較高優先權的運算子會優先被計算。

#+  -   !  ~  ++  - - (type)*  &  sizeof 從右到左 乘除 *  /  % #從左至右到右至右##加減 ## << >> < <=  > >= 相等 #位元與AND 位異或XOR 位元或OR 邏輯與AND 邏輯或OR 條件 
類別 運算子 結合性 
後綴  #() [] -> .  ++   - -  由左至右 
一元 +  -   !  ~  ++  - -
##+  - #由左至右 
移位 
由左至右 關聯 
< <=  > >=  由左至右 
#==  != 由左至右 
由左至右 
由左至右 
由左至右 
&& 由左至右 
|| #從左到右 
?: 

從右到左 

賦值 

####賦值 #### ##=  +=  -=  *=  /=  %=>>=  <<=  &=  ^=   |= ######從右到左 ########### #逗號 ######, ######從左到右 ###############實例######請看下面的實例,了解C++ 中運算符的優先順序。 ######複製並貼上下面的 C++ 程式到 test.cpp 檔案中,編譯並執行程式。 ######對比有括號和沒有括號時的區別,這將產生不同的結果。因為 ()、 /、 * 和 + 有不同的優先級,高優先級的運算元將優先計算。 ###
#include <iostream>
using namespace std;
 
main()
{
   int a = 20;
   int b = 10;
   int c = 15;
   int d = 5;
   int e;
 
   e = (a + b) * c / d;      // ( 30 * 15 ) / 5
   cout << "(a + b) * c / d 的值是 " << e << endl ;

   e = ((a + b) * c) / d;    // (30 * 15 ) / 5
   cout << "((a + b) * c) / d 的值是 " << e << endl ;

   e = (a + b) * (c / d);   // (30) * (15/5)
   cout << "(a + b) * (c / d) 的值是 " << e << endl ;

   e = a + (b * c) / d;     //  20 + (150/5)
   cout << "a + (b * c) / d 的值是 " << e << endl ;
  
   return 0;
}
###當上面的程式碼被編譯和執行時,它會產生以下結果:###
(a + b) * c / d 的值是 90
((a + b) * c) / d 的值是 90
(a + b) * (c / d) 的值是 90
a + (b * c) / d 的值是 50
###