c語言運算子優先順序,結合性 左 右結合詳解

2021-08-13 22:54:36 字數 4379 閱讀 1186

重新翻了遍c語言,覺得對c語言運算子結合性有必要提一下,畢竟去年我自己剛學c語言的時候,就沒搞明白結合性的問題。

什麼是左結合?什麼是右結合?它們是幹嘛用的?它們是什麼時候用的?

本文將圍繞這幾個問題展開..

(小白文,大神繞道)

先附錄幾個自己學習過程中的參考**。(有些見解和例子來自一下**)

在講結合性之前,先提一下c語言的運算子及其優先順序關係。

c語言運算子優先順序

優先順序

運算子

名稱或含義

使用形式

結合方向 說明

1 陣列下標

陣列名[常量表示式]

左到右--

()圓括號

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

成員選擇(物件)

物件.成員名

--->

成員選擇(指標)

物件指標->成員名--2

-負號運算子

-表示式

右到左單目運算子

~按位取反運算子

~表示式

++自增運算子

++變數名/變數名++

--自減運算子

--變數名/變數名--

*取值運算子

*指標變數

&取位址運算子

&變數名

!邏輯非運算子

!表示式(型別

)強制型別轉換

(資料型別)表示式

--sizeof

長度運算子

sizeof(表示式)--3

/除表示式/表示式

左到右雙目運算子*乘

表示式*表示式

%餘數(取模)

整型表示式%整型表示式4

+加表示式+表示式

左到右雙目運算子-減

表示式-表示式5

<< 

左移變數《表示式

左到右雙目運算子

>> 

右移變數》表示式6

大於表示式》表示式

左到右雙目運算子

>=

大於等於

表示式》=表示式

小於表示式《表示式

<=

小於等於

表示式<=表示式7

==等於

表示式==表示式

左到右雙目運算子!=

不等於表示式!= 表示式8

&按位與

表示式&表示式

左到右雙目運算子9

^按位異或

表示式^表示式

左到右雙目運算子10

|按位或

表示式|表示式

左到右雙目運算子11

&&邏輯與

表示式&&表示式

左到右雙目運算子12

||邏輯或

表示式||表示式

左到右雙目運算子13

?:條件運算子

表示式1?

表示式2: 表示式3

右到左三目運算子

14 =賦值運算子

變數=表示式

右到左--

/=除后賦值

變數/=表示式

--*=

乘後賦值

變數*=表示式

--%=

取模後賦值

變數%=表示式

--+=

加後賦值

變數+=表示式

---=

減後賦值

變數-=表示式

--<<=

左移後賦值

變數<<=表示式

-->>=

右移後賦值

變數》=表示式

--&=

按位與後賦值

變數&=表示式

--^=

按位異或後賦值

變數^=表示式

--|=

按位或後賦值

變數|=表示式

--15 ,

逗號運算子

表示式,表示式,…

左到右--

說明:運算子共分為15級,1級優先順序最高,15級優先順序最低。

同一優先順序的運算子,運算次序由結合方向所決定。(結合性:2 13 14 是從右至左 其他都是 從左至右)

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

再詳細一點,附帶乙個口訣。(網上找的)

括號成員第一;               

//括號運算子() 成員運算子. ->

全體單目第二;              

//所有的單目運算子比如++、 --、 +(正)、 -(負) 、指標運算*、&

乘除餘三,加減四;        

//這個"餘"是指取餘運算即%

移位五,關係六;          

//移位運算子:<< >> ,關係:> < >= <= 等

等於(與)不等排第七;      

//即== 和!=

位與異或和位或;   

"三分天下"**十;   

//這幾個都是位運算: 位與(&)異或(^)位或(|) 

邏輯或跟與;             

//邏輯運算子:|| 和 &&

十二和十一;           

//注意順序:優先順序(||) 底於 優先順序(&&) 

條件高於賦值,               

//三目運算子優先順序排到13 位只比賦值運算子和","高

逗號運算級最低!     

//逗號運算子優先順序最低

如果想詳細了解運算子優先順序的關係,我想上面的**和口訣足以了。

有了以上的基礎,我們回歸本篇文章的主題---結合性。

觀察上述運算子**我們不難發現,在優先順序相同的列表中,有的不止存在一種運算子,那當這兩種運算子碰到一起了,該怎麼計算呢?

又或者,兩個相同的運算子在一起,該怎麼進行運算呢?

要解決這些問題,就必須了解結合性了。

c 語言與其他高階語言相比, 乙個顯著的特點就是其運算子特別豐富, 共有34 種運算子。c 語言將這34 種運算子規定了不同的優先級別和結合性。優先順序是用來標識運算子在表示式中的運算順序的, 在求解表示式的值的時候, 總是先按運算子的優先次序由高到低進行操作, 可是, 當乙個運算物件兩側的運算子優先級別相同時, 則按運算子的結合性來確定表示式的運算順序。 

運算子的結合性指同一優先順序的運算子在表示式中操作的組織方向, 即: 當乙個運算物件兩側運算子的優先級別相同時, 運算物件與運算子的結合順序, c 語言規定了各種運算子的結合方向( 結合性) 。

大多數運算子結合方向是「自左至右」, 即: 先左後右, 例如a- b+c, b 兩側有- 和+兩種運算子的優先順序相同, 按先左後右結合方向, b 先與減號結合, 執行a- b 的運算, 再執行加c 的運算。

除了自左至右的結合性外, c 語言有三類運算子參與運算的結合方向是從右至左。即: 單目運算子, 條件運算子, 以及賦值運算子。

關於結合性的概念在其他高階語言中是沒有的, 這是c語言的特點之一,特別是從右至左結合性容易出錯, 下面通過幾個具體的運算子來剖析c 語言運算子的結合性。 

若a 是乙個變數, 則++a 或a++和- - a 或a- - 分別稱為前置加或後置加運算和前置減或後置減運算, 且++a 或a++等價於a=a+1, - - a 或a- - 等價於a=a- 1, 即都是使該變數的值增加1 或減少1。由此可知, 對乙個變數實行前置或後置運算, 其運算結構是相同的, 但當它們與其他運算結合在乙個表示式中時, 其運算值就不同了。

前置運算是變數的值先加1 或減1, 然後將改變後的變數值參與其他運算, 如x=5; y=8; c=++x*y; 運算後, c 的值是48,x 的值是6,y 的值是8。

而後置運算是變數的值先參與有關運算, 然後將變數本身的值加1 減1, 即參加運算的是該變數變化前的值。如x=5; y=8; c=x++*y;運算後, c 的值是40,x 的值是6, y 的值是8。

值得注意的是, 前置、後置運算只能用於變數, 不能用於常量和表示式, 且結合方向是從右至左。如當i=6 時, 求- i++的值和i 的值。由於「- 」(負號) 「++」為同乙個優先順序, 故應理解為- (i++), 又因是後置加, 所以先有- i++的值為- 6, 然後i 增值1 為7, 即i=7。

講到這裡,大家應該都明白了吧。說白了,許多操作符的優先順序都是相同的。這時,操作符的結合性就開始發揮作用了。在表示式中如果有幾個優先順序相同的操作符,結合性就起仲裁的作用,由它決定哪個操作符先執行。先執行,可以看做是加上括號。比如,右結合(從右到左),那就是,把右邊的運算用括號先括起來,再與左邊的進行計算,這樣自然是先執行右邊的了。  比如   int a,b=1,c=2;         a=b=c;  這裡'='的結合性是從右到左。 故a=b=c; 可變為a=(b=c);  即a=2。

差不多就講這些了。  

總的來說,掌握上述優先順序,結合性是有一定用處的,但也不是必須的。 畢竟,咱們有()這個大招不是,**不確定,**補()就是了。

運算子 優先順序 結合性

語言的運算子可分為以下幾類 1.算術運算子 用於各類數值運算。包括加 減 乘 除 求餘 或稱模運算,自增 自減 共七種。2.關係運算子 用於比較運算。包括大於 小於 等於 大於等於 小於等於 和不等於 六種。3.邏輯運算子 用於邏輯運算。包括與 或 非 三種。4.位操作運算子 參與運算的量,按二進位...

C語言運算子優先順序及結合性

今天去翻了下c語言運算子的優先順序和結合性,發現當初學習的時候就沒認真記住,慚愧。發現一篇講得不錯的文章,編輯了下轉來供以後翻閱。c語言運算子優先順序表 由上至下,優先順序依次遞減 運算子 結合性 自左向右 type sizeof 自右向左 自左向右 自左向右 自左向右 自左向右 自左向右 自左向右...

C語言運算子優先順序及結合性

今天去翻了下c語言運算子的優先順序和結合性,發現當初學習的時候就沒認真記住,慚愧。發現一篇講得不錯的文章,編輯了下轉來供以後翻閱。c語言運算子優先順序表 由上至下,優先順序依次遞減 運算子 結合性 自左向右 type sizeof 自右向左 自左向右 自左向右 自左向右 自左向右 自左向右 自左向右...