1. 程式人生 > 其它 >C語言 運算子優先順序和結合方向

C語言 運算子優先順序和結合方向

運算子優先順序和結合方向

初級運算子( )、[ ]、->、. 高於 單目運算子高於 算數運算子(先乘除後加減) 高於 關係運算符高於邏輯運算子(不包括!)高於條件運算子高於賦值運算子 高於逗號運算子。

位運算子的優先順序比較分散。

除了賦值運算子、條件運算子、單目運算子三類的平級運算子之間的結合順序是從右至左,其他都是從左至右。

C語言運算子優先順序

優先順序

運算子

名稱或含義

使用形式

結合方向

說明

1

[]

陣列下標

陣列名[常量表達式]

左到右

--

()

圓括號

(表示式)/函式名(形參表)

--

.

成員選擇(物件)

物件.成員名

--

->

成員選擇(指標)

物件指標->成員名

--

2

-

負號運算子

-表示式

右到左

單目運算子

~

按位取反運算子

~表示式

++

自增運算子

++變數名/變數名++

--

自減運算子

--變數名/變數名--

*

取值運算子

*指標變數

&

取地址運算子

&變數名

!

邏輯非運算子

!表示式

(型別)

強制型別轉換

(資料型別)表示式

--

sizeof

長度運算子

sizeof(表示式)

--

3

/

表示式/表示式

左到右

雙目運算子

*

表示式*表示式

%

餘數(取模)

整型表示式%整型表示式

4

+

表示式+表示式

左到右

雙目運算子

-

表示式-表示式

5

<<

左移

變數<<表示式

左到右

雙目運算子

>>

右移

變數>>表示式

6

>

大於

表示式>表示式

左到右

雙目運算子

>=

大於等於

表示式>=表示式

<

小於

表示式<表示式

<=

小於等於

表示式<=表示式

7

==

等於

表示式==表示式

左到右

雙目運算子

!=

不等於

表示式!= 表示式

8

&

按位與

表示式&表示式

左到右

雙目運算子

9

^

按位異或

表示式^表示式

左到右

雙目運算子

10

|

按位或

表示式|表示式

左到右

雙目運算子

11

&&

邏輯與

表示式&&表示式

左到右

雙目運算子

12

||

邏輯或

表示式||表示式

左到右

雙目運算子

13

?:

條件運算子

表示式1?

表示式2: 表示式3

右到左

三目運算子

14

=

賦值運算子

變數=表示式

右到左

--

/=

除後賦值

變數/=表示式

--

*=

乘後賦值

變數*=表示式

--

%=

取模後賦值

變數%=表示式

--

+=

加後賦值

變數+=表示式

--

-=

減後賦值

變數-=表示式

--

<<=

左移後賦值

變數<<=表示式

--

>>=

右移後賦值

變數>>=表示式

--

&=

按位與後賦值

變數&=表示式

--

^=

按位異或後賦值

變數^=表示式

--

|=

按位或後賦值

變數|=表示式

--

15

逗號運算子

表示式,表示式,…

左到右

--

說明:
同一優先順序的運算子,運算次序由結合方向所決定。

簡單記就是:! > 算術運算子 > 關係運算符 > && > || > 賦值運算子

上表中可以總結出如下規律:

    1. 結合方向只有三個是從右往左,其餘都是從左往右。
    2. 所有雙目運算子中只有賦值運算子的結合方向是從右往左。
    3. 另外兩個從右往左結合的運算子也很好記,因為它們很特殊:一個是單目運算子,一個是三目運算子。
    4. C語言中有且只有一個三目運算子。
    5. 逗號運算子的優先順序最低,要記住。
    6. 此外要記住,對於優先順序:算術運算子 > 關係運算符 > 邏輯運算子 > 賦值運算子。邏輯運算子中“邏輯非 !”除外。

一些容易出錯的優先順序問題

上表中,優先順序同為1 的幾種運算子如果同時出現,那怎麼確定表示式的優先順序呢?這是很多初學者迷糊的地方。下表就整理了這些容易出錯的情況:

優先順序問題表示式經常誤認為的結果實際結果
. 的優先順序高於 *(-> 操作符用於消除這個問題) *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


這些容易出錯的情況,希望讀者好好在編譯器上除錯除錯,這樣印象會深一些。一定要多除錯,光靠看程式碼,水平是很難提上來的。除錯程式碼才是最長水平的。

轉載

本文章轉載於 https://www.cnblogs.com/blogernice/articles/13156017.html
原文作者:blogernice