所謂優先級就是當一個表達式中有多個運算符時,先計算誰,後計算誰。這個其實大家在小學學算術的時候就學過,例如:1+4÷2。但是C語言中的運算符已經遠不止四則運算中的加減乘除了,還有其他很多運算符。當它們出現在同一個表達式中時先計算誰後計算誰呢?所以本節還是有必要講一下的。特別最後還會將所有運算符總結展示出來,然後告訴大家哪個優先級高、哪個優先級低。
首先不需要專門記憶,也沒有必要。因為作為初學者,哪個優先級高、哪個優先級低我們很難記住。就算死記硬背記住了,時間長不用也會忘記。所以當一個表達式中有多個運算符時,如果不知道哪個優先級高哪個優先級低就查一下優先級表,附錄E有一個運算符優先級表。此外用的時間長了自然而然就記住了,這樣記才會記得深刻。而且事實上在編程的時候也不需要考慮優先級的問題。因為如果不知道優先級高低的話,加一個括號就可以了,因為括號( )的優先級是最高的。比如下面的代碼語句中:
根據運算符的優先級,這條語句完全可以寫成:
但是第一種寫法別人一看就知道先計算誰後計算誰。而且加圓括號也是一種編程規範,因為程序不只是寫給自己看。
此外運算符還有「目」和「結合性」的概念,這個很簡單。「目」就是「眼睛」的意思,一個運算符需要幾個數就叫「幾目」。比如加法運算符+,要使用這個運算符需要兩個數,如 3+2。對+而言,3 和 2 就像它的兩隻眼睛,所以這個運算符是雙目的。
C語言中大多數的運算符都是雙目的,也有單目和三目的。單目運算符比如邏輯非,如!1,它就只有一隻眼睛,所以是單目的。整個C語言中只有一個三目運算符,即條件運算符? :。這個稍後講到條件語句的時候再介紹。關於「目」大家了解一下就行了。
那麼「結合性」是什麼呢?上面講的優先級都是關於優先級不同的運算符參與運算時先計算誰後計算誰。但是如果運算符的優先級相同,那麼先計算誰後計算誰呢?這個就是由「結合性」決定的。
比如1+2×3÷4,乘和除的優先級相同,但是計算的時候是從左往右,即先計算乘再計算除,所以乘和除的結合性就是從左往右。就是這麼簡單!
C語言中大多數運算符的結合性都是從左往右,只有三個運算符是從右往左的。一個是單目運算符,另一個是三目運算符,還有一個就是雙目運算符中的賦值運算符=。雙目運算符中只有賦值運算符的結合性是從右往左的,其他的都是從左往右。運算符的「結合性」也不要死記,在不斷使用中就記住了。
優先級
運算符
名稱或含義
使用形式
結合
方向
說明
1
[]
數組下標
數組名[常量表達式]
左到右
()
圓括號
(表達式)
函數名(形參表)
.
成員選擇(對象)
對象.成員名
->
成員選擇(指針)
對象指針->成員名
2
-
負號運算符
-表達式
右到左
單目運算符
(類型)
強制類型轉換
(數據類型)表達式
++
自增運算符
++變量名
變量名++
單目運算符
--
自減運算符
--變量名
變量名--
單目運算符
*
取值運算符
*指針變量
單目運算符
&
取地址運算符
&變量名
單目運算符
!
邏輯非運算符
!表達式
單目運算符
~
按位取反運算符
~表達式
單目運算符
sizeof
長度運算符
sizeof(表達式)
3
/
除
表達式 / 表達式
左到右
雙目運算符
*
乘
表達式*表達式
雙目運算符
%
餘數(取模)
整型表達式%整型表達式
雙目運算符
4
+
加
表達式+表達式
左到右
雙目運算符
-
減
表達式-表達式
雙目運算符
5
<<
左移
變量<<表達式
左到右
雙目運算符
>>
右移
變量>>表達式
雙目運算符
6
>
大於
表達式>表達式
左到右
雙目運算符
>=
大於等於
表達式>=表達式
雙目運算符
<
小於
表達式<表達式
雙目運算符
<=
小於等於
表達式<=表達式
雙目運算符
7
==
等於
表達式==表達式
左到右
雙目運算符
!=
不等於
表達式!= 表達式
雙目運算符
8
&
按位與
表達式&表達式
左到右
雙目運算符
9
^
按位異或
表達式^表達式
左到右
雙目運算符
10
|
按位或
表達式|表達式
左到右
雙目運算符
11
&&
邏輯與
表達式&&表達式
左到右
雙目運算符
12
||
邏輯或
表達式||表達式
左到右
雙目運算符
13
?:
條件運算符
表達式1? 表達式2: 表達式3
右到左
三目運算符
14
=
賦值運算符
變量=表達式
右到左
/=
除後賦值
變量/=表達式
*=
乘後賦值
變量*=表達式
%=
取模後賦值
變量%=表達式
+=
加後賦值
變量+=表達式
-=
減後賦值
變量-=表達式
<<=
左移後賦值
變量<<=表達式
>>=
右移後賦值
變量>>=表達式
&=
按位與後賦值
變量&=表達式
^=
按位異或後賦值
變量^=表達式
|=
按位或後賦值
變量|=表達式
15
,
逗號運算符
表達式,表達式,…
左到右
二、規律總結
上表中可以總結出如下規律:
結合方向只有三個是從右往左,其餘都是從左往右。
所有雙目運算符中只有賦值運算符的結合方向是從右往左。
另外兩個從右往左結合的運算符也很好記,因為它們很特殊:一個是單目運算符,一個是三目運算符。
C語言中有且只有一個三目運算符。
逗號運算符的優先級最低,要記住。
此外要記住,對於優先級:算術運算符 > 關係運算符 > 邏輯運算符 > 賦值運算符。邏輯運算符中「邏輯非 !」除外。
三、一些容易出錯的優先級問題
1. 運算符 ==和!=的優先級低於<、 <=、>、>= ,例如:
2.數學符號「≥」和「≤」在C中分別用「>=」和「<=」表示
3.數學符號「≠」在C語言中用「!=」表示;
4.數學符號「=」在C語言中用「==」表示;C語言中的「=」為賦值運算,將=左側的變量的值作為賦值表達式的值。
5.受長期數學習慣的影響,將關係運算符「==」寫成賦值運算符「=」,是C語言編程中最易出現的邏輯錯誤。
int a = 0;if(a = 5) 語句1;6.受長期數學習慣的影響,誤以為 0 < n < 100可以判斷n是否大於0並且小於100。而實際上,關係運算具有左結合性,同級別的關係符自左向右結合, 0 < n < 100 即 (0 < n) < 100, 而子表達式(0 < n) 的結果非0即1,因此無論n中存什麼值,表達式0 < n < 100 的值永遠為1!同樣,形如9 < 5 < 8 < 6的表達式雖符合C的語法,但C編譯器對此式的理解不同於我們的數學習慣。C編譯器按照關係運算的左結合規則來理解:
9 < 5 < 8 < 6的值為1;9 > 8 >7值為0;若int a=0, b=5, x=100; 則 a <= x <= b的值為1;7.邏輯運算符(非運算符!除外)低於關係運算符,關係運算符低於算數運算符
8.非運算符!優先級高於算數運算
9.易受數學書寫習慣的影響,例如:判斷一個整型變量a是否位於[0,100]。
常見錯誤寫法:
正確寫法:
0 <= a && a <= 100或者 a >= 0 && a <= 100
10.易受不準確性的自然語言習慣的影響。例:輸入一個整數n,如果n不是0或1,則輸出該數。
常見錯誤寫法:
正確寫法:
以上列舉這些容易出錯的情況,最好的學習辦法是大家可以在編譯器上自己好好調試調試,這樣印象才會加深。一定要多調試,光靠看代碼,水平是很難提上來的。實踐動手調試代碼才是最長水平的。
請先點在看,然後公眾號回復"C教程"獲取全部完整資源~
不錯,點個在看吧