
算術運算子
+:正值運算子 / 加法運算子
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 語言教程
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/490610.html
標籤:C
