算術運算符 +:正值運算符 / 加法運算符 int x = 4 + 22; -:負值運算符 / 減法運算符 int y = 61 - 23; *:乘法運算符 int num = 5; printf("%i\n", num * num); // 輸出 25 /:除法運算符 C 語言裡面的 整數除法 是 ...
算術運算符
+
:正值運算符 / 加法運算符
int x = 4 + 22;
-
:負值運算符 / 減法運算符
int y = 61 - 23;
*
:乘法運算符
int num = 5;
printf("%i\n", num * num); // 輸出 25
/
:除法運算符
C 語言裡面的 整數除法 是整除,只會返回整數部分,丟棄小數部分。
float x = 6 / 4;
printf("%f\n", x); // 輸出 1.000000
如果希望得到浮點數的結果,兩個運算數必須至少有一個浮點數。
float x = 6.0 / 4; // 或者寫成 6 / 4.0
printf("%f\n", x); // 輸出 1.500000
%
:取模運算符
返回兩個整數相除的餘數,這個運算符只能用於整數,不能用於浮點數。
int x = 6 % 4; // 2
負數求模的規則是,結果的正負號由第一個運算數的正負號決定。
11 % -5 // 1
-11 % -5 // -1
-11 % 5 // -1
++
:自增運算符
++var
是先執行自增操作,再返回操作後var
的值;var++
則是先返回操作前var
的值,再執行自增操作。
int i = 42;
int j;
j = (i++ + 10); // i: 43 j: 52
j = (++i + 10) // i: 44 // j: 54
--
:自減運算符
--var
是先執行自減操作,再返回操作後var
的值;var++
則是先返回操作前var
的值,再執行自減操作。
關係運算符
>
大於運算符<
小於運算符>=
大於等於運算符<=
小於等於運算符==
相等運算符!=
不相等運算符
關係表達式通常返回0
或1
,表示真偽。0
表示偽,所有非零值表示真。比如,20 > 12
返回1
,12 > 20
返回0
。
註意,不要將相等運算符 ==
寫成 =
。
// 這個式子表示對變數 x 賦值 3,它的返回值為 3,所以 if 判斷總是為真。
// 為了防止出現這種錯誤,可以將變數寫在等號的右邊。
if (x = 3) {}
多個關係運算符不宜連用。
i < j < k
,通常達不到想要的結果,不是保證變數j
的值在i
和k
之間,實際執行的是 (i < j) < k
邏輯運算符
對邏輯運算符來說,任何非零值都表示真,零值表示偽。如,5 || 0
返回1
,5 && 0
返回0
。
&&
:短路與運算符(兩側的表達式都為真,則為真,否則為偽)。
如果左邊的表達式為偽,就不再對右邊的表達式求值。
if (x < 10 && y > 20)
printf("Doing something!\n");
||
:短路或運算符(兩側至少有一個表達式為真,則為真,否則為偽)。
如果左邊的表達式為真,就不再對右邊的表達式求值。
!
:非運算符(改變單個表達式的真偽)。
位運算符
~
:按位取反
將值的二進位按位變成相反值,0 變成 1,1 變成 0,符號位(首位)參與運算。
// 0000 0010
char a = 2;
// 1111 1101,負數補碼符號位不變,其他位取反加 1,得原碼 1000 0010,結果為 -3
char b = ~ a;
&
:與運算
將兩個值的二進位按位進行比較,返回一個新值,當兩個二進位位都為 1,就返回 1,否則返回 0,符號位(首位)參與運算,與運算符 & 可以與賦值運算符 = 結合,簡寫成 &= 。
char a = -2; // 1111 1110
char b = 1; // 0000 0001
char c = a & b; // 0000 0000,結果為 0
|
:或運算
將兩個值的二進位按位進行比較,返回一個新值,當兩個二進位位都為 0,就返回 0,否則返回 1,符號位(首位)參與運算,或運算符 | 可以與賦值運算符 = 結合,簡寫成 |=。
char a = -2; // 1111 1110
char b = 1; // 0000 0001
// 1111 1111,負數補碼符號位不變,其他位取反加 1,得原碼 1000 0001,結果為 -1
char c = a | b;
^
:異或運算
將兩個值的二進位按位進行比較,返回一個新值,當兩個二進位位不同時,就返回 1,否則返回 0,符號位(首位)參與運算,異或運算符 ^可以與賦值運算符 = 結合,簡寫成 ^=。
char a = -2; // 1111 1110
char b = 1; // 0000 0001
// 1111 1111,負數補碼符號位不變,其他位取反加 1,得原碼 1000 0001,結果為 -1
char c = a ^ b;
<<
:左移運算
將左側運算數的二進位向左移動指定的位數,頭部無法容納的值丟棄,尾部空出來的位置使用 0 填充,符號位(首位)參與運算,左移運算符 << 可以與賦值運算符 = 結合,簡寫成 <<=。
char a = 1; // 0000 0001
a = a << 2; // 0000 0100,結果為 4
char b = 33; // 0010 0001
// 1000 0100,負數補碼符號位不變,其他位取反加 1,得原碼 1111 1100,結果為 -124
b = b << 2;
>>
:右移運算
將左側運算數的二進位向右移動指定的位數,尾部無法容納的值丟棄,頭部空出來的位置,使用符號位
填充。
右移運算符最好不要用於負數,因為不同系統對於右移後如何處理負數的符號位,有不同的做法,可能會得到不一樣的結果。
右移運算符 >> 可以與賦值運算符 = 結合,簡寫成 >>=。
char a = 4; // 0000 0100
a = a >> 2; // 0000 0001,結果為 1
運算符優先順序
部分運算符的優先順序順序(按照優先順序從高到低排列)。
- 圓括弧(
()
) - 自增運算符(
++
),自減運算符(--
) - 一元運算符(
+
和-
) - 乘法(
*
),除法(/
) - 加法(
+
),減法(-
) - 關係運算符(
<
、>
等) - 賦值運算符(
=
)
如果兩個運算符優先順序相同,則根據運算符是左結合,還是右結合,決定執行順序。大部分運算符是左結合(從左到右執行),少數運算符是右結合(從右到左執行),比如賦值運算符(=
)。
參考: C 語言教程