介紹C運算子和運算符優先順序
C提供了各種各樣的運算子,我們可以用它們來操作數據。
特別是,我們可以識別出各種組運算符:
- 算術運算符
- 比較運算符
- 邏輯運算符
- 複合賦值運算符
- 位運算符
- 指針運算符
- 結構運算符
- 其他運算符
在這篇博文中,我將詳細介紹它們,並使用兩個虛擬變量a
和b
作為例子。
我會專門為位運算符、結構運算符和指針運算符撰寫另一篇博文。
算術運算符
在這個大組中,我將區分二元運算符和一元運算符。
二元運算符使用兩個操作數進行運算:
運算符 | 名稱 | 示例 |
---|---|---|
= |
賦值 | a = b |
+ |
加法 | a + b |
- |
減法 | a - b |
* |
乘法 | a * b |
/ |
除法 | a / b |
% |
模除 | a % b |
一元運算符只需要一個操作數:
運算符 | 名稱 | 示例 |
---|---|---|
+ |
正數 | +a |
- |
負數 | -a |
++ |
自增 | a++ 或++a |
-- |
自減 | a-- 或--a |
a++
和++a
的區別在於a++
在使用後對a
進行自增。++a
在使用之前對a
進行自增。
舉個例子:
int a = 2;
int b;
b = a++ /* b為2,a為3 */
b = ++a /* b為4,a為4 */
遞減運算符也是一樣的道理。
比較運算符
運算符 | 名稱 | 示例 |
---|---|---|
== |
等於 | a == b |
!= |
不等於 | a != b |
> |
大於 | a > b |
< |
小於 | a < b |
>= |
大於等於 | a >= b |
<= |
小於等於 | a <= b |
邏輯運算符
!
非(示例:!a
)&&
且(示例:a && b
)||
或(示例:a || b
)
當處理布爾值時,這些運算符非常有用。
複合賦值運算符
這些運算符對於進行賦值和同時進行算術運算很有用:
運算符 | 名稱 | 示例 |
---|---|---|
+= |
加等於 | a += b |
-= |
減等於 | a -= b |
*= |
乘等於 | a *= b |
/= |
除等於 | a /= b |
%= |
模除等於 | a %= b |
其他運算符
三元運算符
三元運算符是C中唯一使用三個操作數的運算符,它是表示條件的簡短方法。
它的結構如下:
<條件> ? <表達式1> : <表達式2>
示例:
a ? b : c
如果a
的值為真,則執行b
語句,否則執行c
語句。
三元運算符在功能上與if/else條件語句相同,只是表達方式更簡短,並且可以嵌入到表達式中。
sizeof
sizeof
運算符返回你傳遞的操作數的大小。你可以傳遞變量,甚至是類型。
示例用法:
#include <stdio.h>
int main(void) {
int age = 37;
printf("%ld\n", sizeof(age));
printf("%ld", sizeof(int));
}
運算符優先順序
有了所有這些運算符(以及我在本文中未涉及的更多運算符,包括位運算符、結構運算符和指針運算符),我們在單個表達式中使用它們時必須注意。
假設我們有這個操作:
int a = 2;
int b = 4;
int c = b + a * a / b - a;
c
的值是什麼?我們是否在執行加法之前先執行乘法和除法?
有一套規則可以幫助我們解決這個問題。
從優先順序最低到最高,我們有:
- 賦值運算符
=
+
和-
二元運算符*
和/
運算符+
和-
一元運算符
運算符還有一個結合規則,除了一元運算符和賦值運算符外,它始終從左到右。
在:
int c = b + a * a / b - a;
我們首先執行a * a / b
,由於從左到右,我們可以將其分解為a * a
和結果/ b
:2 * 2 = 4
,4 / 4 = 1
。
然後我們可以進行加法和減法:4 + 1 - 2。c
的值是3
。
無論如何,我想確保你明白你可以使用括號使任何類似的表達式更易於閱讀和理解。
括號高於其他任何運算符。
上面的示例表達式可以重寫為:
int c = b + ((a * a) / b) - a;
這樣我們不需要太多思考。