1+4÷2
。( )
的優先順序是最高的。比如前面的程式中:
k = (j>i) && (8==i);
根據運算子的優先順序,這條語句完全可以寫成:k = j>i && 8==i;
但是第一種寫法別人一看就知道先計算誰後計算誰。+
,要使用這個運算子需要兩個數,如 3+2。對+
而言,3 和 2 就像它的兩隻眼睛,所以這個運算子是雙目的。!1
,它就只有一隻眼睛,所以是單目的。整個C語言中只有一個三目運算子,即條件運算子? :
。這個稍後講到條件語句的時候再介紹。關於“目”大家了解一下就行了。1+2×3÷4
,乘和除的優先順序相同,但是計算的時候是從左往右,即先計算乘再計算除,所以乘和除的結合性就是從左往右。就是這麼簡單!=
。雙目運算子中只有賦值運算子的結合性是從右往左的,其他的都是從左往右。運算子的“結合性”也不要死記,在不斷使用中就記住了。
優先順序 |
運算子 |
名稱或含義 |
使用形式 |
結合方向 |
說明 |
---|---|---|---|---|---|
1 |
[] |
陣列下標 |
陣列名[常數表示式] |
左到右 |
|
() |
圓括號 |
(表示式) |
|||
. |
成員選擇(物件) |
物件.成員名 |
|||
-> |
成員選擇(指標) |
物件指標->成員名 |
|||
2 |
- |
負號運算子 |
-表示式 |
右到左 |
單目運算子 |
(型別) |
強制型別轉換 |
(資料型別)表示式 |
|||
++ |
自增運算子 |
++變數名 |
單目運算子 |
||
-- |
自減運算子 |
--變數名 |
單目運算子 |
||
* |
取值運算子 |
*指標變數 |
單目運算子 |
||
& |
取地址運算子 |
&變數名 |
單目運算子 |
||
! |
邏輯非運算子 |
!表示式 |
單目運算子 |
||
~ |
按位元取反運算子 |
~表示式 |
單目運算子 |
||
sizeof |
長度運算子 |
sizeof(表示式) |
|||
3 |
/ |
除 |
表示式 / 表示式 |
左到右 |
雙目運算子 |
* |
乘 |
表示式*表示式 |
雙目運算子 |
||
% |
餘數(取模) |
整型表示式%整型表示式 |
雙目運算子 |
||
4 |
+ |
加 |
表示式+表示式 |
左到右 |
雙目運算子 |
- |
減 |
表示式-表示式 |
雙目運算子 |
||
5 |
<< |
左移 |
變數<<表示式 |
左到右 |
雙目運算子 |
>> |
右移 |
變數>>表示式 |
雙目運算子 |
||
6 |
> |
大於 |
表示式>表示式 |
左到右 |
雙目運算子 |
>= |
大於等於 |
表示式>=表示式 |
雙目運算子 |
||
< |
小於 |
表示式<表示式 |
雙目運算子 |
||
<= |
小於等於 |
表示式<=表示式 |
雙目運算子 |
||
7 |
== |
等於 |
表示式==表示式 |
左到右 |
雙目運算子 |
!= |
不等於 |
表示式!= 表示式 |
雙目運算子 |
||
8 |
& |
按位元與 |
表示式&表示式 |
左到右 |
雙目運算子 |
9 |
^ |
按位元互斥或 |
表示式^表示式 |
左到右 |
雙目運算子 |
10 |
| |
按位元或 |
表示式|表示式 |
左到右 |
雙目運算子 |
11 |
&& |
邏輯與 |
表示式&&表示式 |
左到右 |
雙目運算子 |
12 |
|| |
邏輯或 |
表示式||表示式 |
左到右 |
雙目運算子 |
13 |
?: |
條件運算子 |
表示式1? 表示式2: 表示式3 |
右到左 |
三目運算子 |
14 |
= |
賦值運算子 |
變數=表示式 |
右到左 |
|
/= |
除後賦值 |
變數/=表示式 |
|||
*= |
乘後賦值 |
變數*=表示式 |
|||
%= |
取模後賦值 |
變數%=表示式 |
|||
+= |
加後賦值 |
變數+=表示式 |
|||
-= |
減後賦值 |
變數-=表示式 |
|||
<<= |
左移後賦值 |
變數<<=表示式 |
|||
>>= |
右移後賦值 |
變數>>=表示式 |
|||
&= |
按位元與後賦值 |
變數&=表示式 |
|||
^= |
按位元互斥或後賦值 |
變數^=表示式 |
|||
|= |
按位元或後賦值 |
變數|=表示式 |
|||
15 |
, |
逗號運算子 |
表示式,表示式,… |
左到右 |
|
優先順序問題 | 表示式 | 經常誤認為的結果 | 實際結果 |
---|---|---|---|
. 的優先順序高於 *(-> 操作符用於消除這個問題) | *p.f |
p 所指物件的欄位 f,等價於: (*p).f |
對 p 取 f 偏移,作為指標,然後進行解除參照操作,等價於: *(p.f) |
[] 高於 * | int *ap[] |
ap 是個指向 int 陣列的指標,等價於: int (*ap)[] |
ap 是個元素為 int 指標的陣列,等價於: int *(ap []) |
函數 () 高於 * | int *fp() |
fp 是個函數指標,所指函數返回 int,等價於: int (*fp)() |
fp 是個函數,返回 int*,等價於: int* ( fp() ) |
== 和 != 高於位元運算 | (val & mask != 0) | (val &mask) != 0 | val & (mask != 0) |
== 和 != 高於賦值符 | c = getchar() != EOF | (c = getchar()) != EOF | c = (getchar() != EOF) |
算術運算子高於位移 運算子 | msb << 4 + lsb | (msb << 4) + lsb | msb << (4 + lsb) |
逗號運算子在所有運 算符中優先順序最低 | i = 1, 2 | i = (1,2) | (i = 1), 2 |