C 運算符


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

  • #算術運算符

  • ##關係運算子

  • 邏輯運算子

  • 位元運算子

  • 賦值運算子

  • 雜項運算子

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

算術運算子

下表顯示了 C 語言支援的所有算術運算子。假設變數

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

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

實例

請看下面的實例,了解C 語言中所有可用的算術運算子:

#include <stdio.h>main(){   int a = 21;   int b = 10;   int c ;

   c = a + b;
   printf("Line 1 - c 的值是 %d\n", c );
   c = a - b;
   printf("Line 2 - c 的值是 %d\n", c );
   c = a * b;
   printf("Line 3 - c 的值是 %d\n", c );
   c = a / b;
   printf("Line 4 - c 的值是 %d\n", c );
   c = a % b;
   printf("Line 5 - c 的值是 %d\n", c );
   c = a++; 
   printf("Line 6 - c 的值是 %d\n", c );
   c = a--; 
   printf("Line 7 - c 的值是 %d\n", c );}

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

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

關係運算子

下表顯示了C 語言支援的所有關係運算子。假設變數A 的值為10,變數B 的值為20,則:

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

檢查左運算元的值是否小於右邊運算元的值,如果是則條件為真。

(A < B) 為真。

>=

檢查左運算元的值是否大於或等於右運算元的值,如果是則條件為真。 (A >= B) 不為真。

<=檢查左運算元的值是否小於或等於右邊運算元的值,如果是則條件為真。 (A <= B) 為真。 實例
#include <stdio.h>main(){   int a = 21;   int b = 10;   int c ;   if( a == b )   {
      printf("Line 1 - a 等于 b\n" );   }   else   {
      printf("Line 1 - a 不等于 b\n" );   }   if ( a < b )   {
      printf("Line 2 - a 小于 b\n" );   }   else   {
      printf("Line 2 - a 不小于 b\n" );   }   if ( a > b )   {
      printf("Line 3 - a 大于 b\n" );   }   else   {
      printf("Line 3 - a 不大于 b\n" );   }   /* 改变 a 和 b 的值 */
   a = 5;
   b = 20;   if ( a <= b )   {
      printf("Line 4 - a 小于或等于 b\n" );   }   if ( b >= a )   {
      printf("Line 5 - b 大于或等于 b\n" );   }}
Line 1 - a 不等于 bLine 2 - a 不小于 bLine 3 - a 大于 bLine 4 - a 小于或等于 bLine 5 - b 大于或等于 b
#下表顯示了C 語言支援的所有關係邏輯運算子。假設變數AB##運算子&&
請看下面的實例,了解C 語言中所有可用的關係運算子:當上面的程式碼被編譯和執行時,它會產生下列結果:邏輯運算子
的值為1,變數 的值為0,則:
描述實例
稱為邏輯與運算子。如果兩個操作數都非零,則條件為真。 ######(A && B) 為假。 ############||######稱為邏輯或運算子。如果兩個操作數中有任一個非零,則條件為真。 ######(A || B) 為真。 ############!######稱為邏輯非運算子。用來逆轉操作數的邏輯狀態。如果條件為真則邏輯非運算子將使其為假。 ######!(A && B) 為真。 ############

實例

請看下面的實例,了解C 語言中所有可用的邏輯運算子:

#include <stdio.h>main(){   int a = 5;   int b = 20;   int c ;   if ( a && b )   {
      printf("Line 1 - 条件为真\n" );   }   if ( a || b )   {
      printf("Line 2 - 条件为真\n" );   }   /* 改变 a 和 b 的值 */
   a = 0;
   b = 10;   if ( a && b )   {
      printf("Line 3 - 条件为真\n" );   }   else   {
      printf("Line 3 - 条件不为真\n" );   }   if ( !(a && b) )   {
      printf("Line 4 - 条件为真\n" );   }}

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

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

位元運算子

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

##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
#描述
&如果同時存在於兩個運算元中,二進位AND 運算子複製一位到結果中。
|如果存在於任一操作數中,二進位OR 運算符複製一位到結果中。
^如果存在於其中一個運算元中但不同時存在於兩個運算元中,二進位異或運算子複製一位到結果中。
######~######二進位補碼運算子是一元運算符,具有"翻轉"位效果。 ######(~A ) 將得到 -61,即為 1100 0011,2 的補碼形式,帶符號的二進制數。 ############<<######二進位左移運算子。左操作數的值向左移動右操作數所指定的位數。 ######A << 2 將得到 240,即為 1111 0000############>>#######二進位右移運算子。左操作數的值向右移動右操作數所指定的位數。 ######A >> 2 將得到 15,即為 0000 1111############

實例

請看下面的實例,了解C 語言中所有可用的位元運算子:

#include <stdio.h>main(){   unsigned int a = 60;/* 60 = 0011 1100 */  
   unsigned int b = 13;/* 13 = 0000 1101 */   int c = 0;           

   c = a & b;       /* 12 = 0000 1100 */ 
   printf("Line 1 - c 的值是 %d\n", c );

   c = a | b;       /* 61 = 0011 1101 */
   printf("Line 2 - c 的值是 %d\n", c );

   c = a ^ b;       /* 49 = 0011 0001 */
   printf("Line 3 - c 的值是 %d\n", c );

   c = ~a;          /*-61 = 1100 0011 */
   printf("Line 4 - c 的值是 %d\n", c );

   c = a << 2;     /* 240 = 1111 0000 */
   printf("Line 5 - c 的值是 %d\n", c );

   c = a >> 2;     /* 15 = 0000 1111 */
   printf("Line 6 - c 的值是 %d\n", c );}

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

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

賦值運算子

下表列出了C 語言支援的賦值運算子:

##描述簡單的賦值運算符,把右邊運算元的值賦給左邊運算元加上且賦值運算符,把右邊運算元加上左邊運算數的結果賦值給左邊運算元減且賦值運算符,把左邊運算元減去右邊運算元的結果賦值給左邊運算元##*=乘且賦值運算符,把右邊運算元乘以左邊運算元的結果賦值給左邊運算元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 = A + B 將把A + B 的值賦給C#+=
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
#include <stdio.h>main(){   int a = 21;   int c ;

   c =  a;
   printf("Line 1 - =  运算符实例,c 的值 = %d\n", c );

   c +=  a;
   printf("Line 2 - += 运算符实例,c 的值 = %d\n", c );

   c -=  a;
   printf("Line 3 - -= 运算符实例,c 的值 = %d\n", c );

   c *=  a;
   printf("Line 4 - *= 运算符实例,c 的值 = %d\n", c );

   c /=  a;
   printf("Line 5 - /= 运算符实例,c 的值 = %d\n", c );

   c  = 200;
   c %=  a;
   printf("Line 6 - %= 运算符实例,c 的值 = %d\n", c );

   c <<=  2;
   printf("Line 7 - <<= 运算符实例,c 的值 = %d\n", c );

   c >>=  2;
   printf("Line 8 - >>= 运算符实例,c 的值 = %d\n", c );

   c &=  2;
   printf("Line 9 - &= 运算符实例,c 的值 = %d\n", c );

   c ^=  2;
   printf("Line 10 - ^= 运算符实例,c 的值 = %d\n", c );

   c |=  2;
   printf("Line 11 - |= 运算符实例,c 的值 = %d\n", c );}
當上面的程式碼被編譯和執行時,它會產生下列結果:
Line 1 - =  运算符实例,c 的值 = 21Line 2 - += 运算符实例,c 的值 = 42Line 3 - -= 运算符实例,c 的值 = 21Line 4 - *= 运算符实例,c 的值 = 441Line 5 - /= 运算符实例,c 的值 = 21Line 6 - %= 运算符实例,c 的值 = 11Line 7 - <<= 运算符实例,c 的值 = 44Line 8 - >>= 运算符实例,c 的值 = 11Line 9 - &= 运算符实例,c 的值 = 2Line 10 - ^= 运算符实例,c 的值 = 0Line 11 - |= 运算符实例,c 的值 = 2
sizeof? :。 運算子描述#實例sizeof()傳回變數的大小。 sizeof(a) 將會傳回 4,其中 a 是整數。
實例請看下面的實例,了解C 語言中所有可用的賦值運算子:
雜項運算子↦ sizeof & 三元#下表列出了C 語言支援的其他一些重要的運算符,包括
#########&######傳回變數的位址。 ######&a; 將給出變數的實際位址。 ############*######指向一個變數。 ######*a; 將指向一個變數。 ############? :######條件表達式######如果條件為真?則值為X : 否則值為Y####### #####

實例

請看下面的實例,了解C 語言中所有可用的雜項運算子:

#include <stdio.h>main(){   int a = 4;   short b;   double c;   int* ptr;   /* sizeof 运算符实例 */
   printf("Line 1 - 变量 a 的大小 = %d\n", sizeof(a) );
   printf("Line 2 - 变量 b 的大小 = %d\n", sizeof(b) );
   printf("Line 3 - 变量 c 的大小 = %d\n", sizeof(c) );   /* & 和 * 运算符实例 */
   ptr = &a;/* 'ptr' 现在包含 'a' 的地址 */
   printf("a 的值是 %d\n", a);
   printf("*ptr 是 %d\n", *ptr);   /* 三元运算符实例 */
   a = 10;
   b = (a == 1) ? 20: 30;
   printf( "b 的值是 %d\n", b );

   b = (a == 10) ? 20: 30;
   printf( "b 的值是 %d\n", b );}

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

a 的值是 4*ptr 是 4b 的值是 30b 的值是 20

C 中的運算子優先權

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

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

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

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

從右到左 

賦值 
################賦值 #### ##=  +=  -=  *=  /=  %=>>=  <<=  &=  ^=   |= ######從右到左 ########### #逗號 ######, ######從左到右 ###############實例######請看下面的實例,了解C 語言中運算子的優先權:###
#include <stdio.h>main(){   int a = 20;   int b = 10;   int c = 15;   int d = 5;   int e;
 
   e = (a + b) * c / d;      // ( 30 * 15 ) / 5
   printf("(a + b) * c / d 的值是 %d\n",  e );

   e = ((a + b) * c) / d;    // (30 * 15 ) / 5
   printf("((a + b) * c) / d 的值是 %d\n" ,  e );

   e = (a + b) * (c / d);   // (30) * (15/5)
   printf("(a + b) * (c / d) 的值是 %d\n",  e );

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