C語言基礎7-運算符優先級和結合性一覽表

2022-01-02 冰巖編程

所謂優先級就是當一個表達式中有多個運算符時,先計算誰,後計算誰。這個其實大家在小學學算術的時候就學過,例如: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教程"獲取全部完整資源~

不錯,點個在看吧

相關焦點

  • C/C++運算符優先級和結合性
    運算過程存在優先級和結合性兩個問題。在數學的四則運算中規定,先算括號,再算乘除,最後算加減,不同運算符具有不同的計算順序,這就是運算優先級問題;同時,還規定同級運算從左往右依次計算,這是計算的結合性問題。
  • MATLAB運算符優先級一覽表
    MATLAB 在執行含有關係運算和邏輯運算的數學運算時,同樣遵循一套優先級原則。
  • c語言運算符號
    C語言運算符號指的是運算符號。C語言中的符號分為10類:算術運算符、關係運算符、邏輯運算符、位操作運算符、賦值運算符、條件運算符、逗號運算符、指針運算符、求字節數運算符和特殊運算符。注意事項運算符號的優先級總個數34 種相關概念優先級、結合性種類算術運算符用於各類數值運算。
  • C語言之·操作符
    > 316 + (c = 3 + 8 )17最後一個表達式看上去雖然很奇怪,但是在C中完全合法,因為它是兩個子表達式的和,每個子表達式都有一個值🍓2.一些複雜表達式的值表達式求值的順序一部分是由操作符的優先級和結合性決定。
  • C語言運算符優先級(超詳細)
    每當想找哪個運算符優先級高時,很多時候總是想找的就沒有,真讓人氣憤!現在,終於有個我個人覺得非常全的,分享給大家,歡迎拍磚!
  • c語言基礎語法五:運算符與表達式
    n1; return 0;}3.取地址符&在scanf_s的時候,要求傳遞變量的地址,但是變量的地址又是無法預測的,所以我們需要使用C語言提供的取地址符&去獲取變量的地址。intnNum = 10;nNum=10, 20, 30;運算完畢之後,nNum等於10,因為=運算符的優先級更高。nNum= (10, 20, 30);運算完畢之後,nNum等於30,因為先算括號裡面的,逗號表達式的值是最後一個數的值,所以(10, 20, 30)的結果是30,然後再賦值。
  • C語言運算符優先級列表(超詳細)--C語言入門必學
    C語言運算符優先級優先級運算符
  • python運算符優先級,加減乘除只是基礎,學習python第2天
    在計算機編程中少不了運算,而python運算符有哪些呢?python運算符優先級順序又是怎麼樣的?就像數學一樣,加減乘除只是基礎,了解python運算符才能解決實際性的問題。而python運算符有哪些以及它們的優先級又是怎麼樣的呢?下面用一張表格來說明,下表將按照python運算符的優先級順序從高到底進行排序。(在實際項目中,如果搞不清楚運算符優先級,可以通過括號保證括號內的運算優先進行。)
  • [C語言] 運算符和表達式
    運算符和表達式運算符
  • NJS14丨淺談C語言的運算符與表達式1
    2、算術運算的優先級與結合性算術運算符的優先級規定為:先乘除模,後加減,括號最優先。乘、除、模運算符的優先級相同,並高於加減運算符。括號中的內容優先級最高。例:a+b*c;說明:乘號優先級高於加號,故先運算b*c,所得的結果再與a相加。(a+b)*(c-d)-6;說明:括號的優先級最高,*次之,減號優先級最低.故先運算(a+b)和(c-d),然後將二者的結果相乘,最後再與6相減。算術運算的結合性規定為自左至右方向,稱為「左結合性」。
  • c語言的選擇結構(一)
    例如:(一)工程師崗位面試(關係運算符和邏輯運算符)題目要求:上海一家IT企業招聘c/c++開發工程師,滿足以下任職要求者可以獲得面試機會。在c語言中關係運算符共有六種。關係運算符含義優先級結合性<小於這幾個運算符優先級相同,但比下面高。左結合<=小於或等於>大於>=大於或等於==等於這幾個運算符優先級相同,但比上面低。
  • C語言中的運算符
    ,他們也是運算符,並且優先級與括號相當,這也是我們把兩者放在一起討論的原因。至於如何使用則是結構體的內容。單目運算符:單目運算符有很多,例如:!邏輯非、~按位取反、++自增、--自減、+正、-負、&求地址運算符、*間址運算符、sizeof()求所佔字節數、(類型名)強制類型轉換。這些運算符的運算對象只有一個。
  • 我被運算符優先級坑了......
    所以我們一般改寫成 low+(high - low) / 2但是其實還可以進一步優化:low+(high - low) >> 1但是基礎知識紮實的朋友看到這運算符的優先級。我從百度百科上截了一張圖下來,可以發現加減的優先級是要高於左移右移的。
  • C語言入門基礎知識大全
    轉換優先級為:char < int < float < double 即左邊級別「低「的類型向右邊轉換。具體地說,若在表達式中優先級最高的數據是double型,則此表達式中的其他數據均被轉換成double型,且計算結果也是double型;若在表達式中優先級最高的數據是float型,則此表達式中的其他數據均被轉換成float型,且計算結果也是float型。
  • C語言基礎知識整理
    源程序的擴展名為 .c ,目標程序的擴展名為 .obj  , 可執行程序的擴展名為 .exe 。在編寫程序時,必須為函數、變量等命名,這個名字稱為標識符。C語言中標識符的命名規則如下:標識符只能由字母、數字、下劃線組成;標識符的第一個字母必須是字母和下劃線;標識符區分大小寫字母,如If和if是兩個完全不同的標識符。
  • 驗證工程師經常犯的錯誤(2) --- 運算符優先級
    今天就跟大家來聊一聊運算符的優先級問題,下面所有的錯誤都是Q哥曾經犯過的,說多了都是淚啊。。。 殊不知這樣實際等效於 xyz = a << (1+b) ; 而且,加空格完全不能改變優先級,新手一定要明白這一點! 正確的寫法應該是 xyz = (a << 1) + b;。 如果是if(a+b == c), 那麼+的優先級高於==,所以等效於if((a+b) == c)。
  • 單片機c語言教程第七章--運算符和表達式(關係運算符)
    單片機c語言教程第七章--運算符和表達式(關係運算符) 佚名 發表於 2009-04-15 09:37:37 關係運算符,同樣我們也並不陌生。
  • 快速上手系列-C語言之基礎篇(二)數據類型與運算符
    在上一篇文章《快速上手系列-C語言之基礎篇(一)》中寫了關於C語言的程序結構,關鍵字及控制語句。本篇主要寫寫C語言中數據類型,以及運算符相關方面的知識。四、運算符與表達式1、數據在運算中使用的運算符包括:運算符的種類、優先級和結合性2、C語言常見的運算符:算術運算符 (+、-、*、/、%、++、--)這裡需要注意一下「++」
  • C語言自學入門|最全基礎知識總結!
    轉換優先級為:char < int < float < double 即左邊級別「低「的類型向右邊轉換。具體地說,若在表達式中優先級最高的數據是double型,則此表達式中的其他數據均被轉換成double型,且計算結果也是double型;若在表達式中優先級最高的數據是float型,則此表達式中的其他數據均被轉換成float型,且計算結果也是float型。
  • 【新生專欄】C語言輸入輸出與基本運算
    \t水平制表(跳到下一個TAB位置)\v垂直制表\』代表一個單引號字符\」代表一個雙引號字符\?1A++ 將得到 11--自減運算符,整數值減少 1A-- 將得到 9      PS:在C語言中「/」與數學中的除法有異,對於兩個操作數都是整數的相除結果向下取整而對於其中一個或者兩個操作數為浮點型時,那麼則與數學中除法無異值得注意的是對於語句A=10;A++