C 運算符
運算子是一種告訴編譯器執行特定的數學或邏輯運算的符號。 C 語言內建了豐富的運算符,並提供了以下類型的運算符:
#算術運算符
- ##關係運算子
- 邏輯運算子
- 位元運算子
- 賦值運算子
- 雜項運算子
A 的值為10,變數B 的值為20,則:
#描述 | 實例 | |
把兩個運算元相加 | A + B 將會得到30 | |
從第一個運算元中減去第二個運算元 | A - B 將會得到-10 | |
把兩個運算元相乘 | A * B 將得到200 | |
分子除以分母 | B / A 將得到2 |
實例
請看下面的實例,了解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) 為真。 | ||
---|---|---|
請看下面的實例,了解C 語言中所有可用的關係運算子: | 當上面的程式碼被編譯和執行時,它會產生下列結果: | 邏輯運算子 |
的值為1,變數 | B的值為0,則: | |
描述 | 實例 |
實例
請看下面的實例,了解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 - 条件为真
位元運算子
位元運算子作用於位,並逐位執行操作。 &、 | 與^ 的真值表如下:
p | q | p & q | # #p | q | p ^ q |
---|---|---|---|---|
0 | #0 | 0 | ##0#0 | |
1 | 0 | ##1 | 1 | |
#1 | 1 | 1 | 1 | #0 |
1 | 0 | 0 | 1 | 1 |
#~A = 1100 0011下表顯示了C 語言支援的位元運算子。假設變數A
的值為60,變數#描述 | ||
& | 如果同時存在於兩個運算元中,二進位AND 運算子複製一位到結果中。 | |
| | 如果存在於任一操作數中,二進位OR 運算符複製一位到結果中。 | |
^ | 如果存在於其中一個運算元中但不同時存在於兩個運算元中,二進位異或運算子複製一位到結果中。 |
實例
請看下面的實例,了解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 + 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 語言中所有可用的賦值運算子: | |
雜項運算子↦ sizeof & 三元 | #下表列出了C 語言支援的其他一些重要的運算符,包括 | sizeof和 | ? :
運算子 | 描述 | |
sizeof() | 傳回變數的大小。 |
實例
請看下面的實例,了解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從右到左 |
乘除 | * / % | #從左至右到右至右 |
##加減 | ##+ - | #由左至右 |
移位 | ||
由左至右 | 關聯 | |
< <= > >= | 由左至右 | |
#== != | 由左至右 | |
& | 由左至右 | |
^ | 由左至右 | |
| | 由左至右 | |
&& | 由左至右 | |
|| | #從左到右 |
#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###