如何理解c語言的左結合和右結合性

2021-03-06 11:01:25 字數 4976 閱讀 8466

1樓:超級一起的回憶

意思是:從表示式右邊開始執行;只有同優先順序的運算子才具有結合性「自左至右」或者「自右自左」一說。

有些運算子的優先順序是錯誤的。

「當按照常規方式使用時,可能引起誤會的任何運算子」就是存在錯誤優先順序的運算子。

.的優先順序高於*。->操作符用於消除這個問題。

*p.f變成了*(p.f)而不是(*p).f

高於*,於是int *ap中的ap變成了元素為int指標的陣列。

函式()高於*,因此,int *fp()不再是函式指標了,而是一個函式,返回int *。

逗號運算子在所有運算子中優先順序最低,所以,i = 1, 2就成了(i = 1), 2而不是i = (1, 2)。

逗號運算子的值是最右邊運算元的值,逗號運算子結合性從左至右,因此又稱為順序求值運算子。

2樓:

指的是程式在計算時的計算順序,比如算 1+2+3+4左結合性:

1+2+3+4 =

3+3+4

6+410

而右結合性是相反的。

當然計算的順序跟運算子號的優先順序有關,先優先順序再考慮結合性。

c語言中,哪些運算子具有左結合性?哪些具有右結合性?

3樓:夏末的晨曦

1級(左結合) () 圓括號;下標運算

符;->指向結構體成員運算子;. 結構體成員運算子。 2級(右結合) !

邏輯非運算子;~按位取反運算子;++字首增量運算子;--字首減量運算子;+正號運算子;-負號運算子;(型別)型別轉換運算子;*指標運算子;&地址運算子;sizeof長度運算子。 3級(左結合) *乘法運算子;/除法運算子;%取餘運算子。 4級(左結合) +加法運算子;-減法運算子。

5級(左結合) 《左移運算子;>>右移運算子。 6級(左結合) <、<=、>、>=關係運算子。 7級(左結合) ==等於運算子;!

=不等於運算子。 8級(左結合) &按位與運算子。 9級(左結合) ^按位異或運算子。

10級(左結合) |按位或運算子。 11級(左結合) &&邏輯與運算子。 12級(左結合) ||邏輯或運算子。

13級(右結合) ? :條件運算子。

14級(右結合) =、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>=賦值運算子。 15級(左結合) ,逗號運算子。

編輯本段運算子優先順序與結合性

運算子的優先順序:c語言中,運算子的運算優先順序共分為15 級。1 級最高,15 級最低。

在表示式中,優先順序較高的先於優先順序較低的進行運算。而在一個運算量兩側的運算子 優先順序相同時,則按運算子的結合性所規定的結合方向處理。 運算子的結合性:

c語言中各運算子的結合性分為兩種,即左結合性(自左至右)和右結合性(自右至左)。例如算術運算子的結合性是自左至右,即先左後右。如有表示式x-y+z 則y 應先與「-」號結合,執行x-y 運算,然後再執行+z 的運算。

這種自左至右的結合 方向就稱為「左結合性」。而自右至左的結合方向稱為「右結合性」。最典型的右結合 性運算子是賦值運算子。

如x=y=z,由於「=」的右結合性,應先執行y=z 再執行x=(y=z) 運算。c語言運算子中有不少為右結合性,應注意區別,以避免理解錯誤。 優先順序從上到下依次遞減,最上面具有最高的優先順序,逗號操作符具有最低的優先順序。

所有的優先順序中,只有三個優先順序是從右至左結合的,它們是單目運算子、條件運算子、賦值運算子。其它的都是從左至右結合。 具有最高優先順序的其實並不算是真正的運算子,它們算是一類特殊的操作。

()是與函式相關,與陣列相關,而->及.是取結構成員。 其次是單目運算子,所有的單目運算子具有相同的優先順序,因此在我認為的 真正的運算子中它們具有最高的優先順序,又由於它們都是從右至左結合的,因此*p++與*(p++)等效是毫無疑問的。

另外在c語言裡,沒有前置後置之分,因為++ -- 是右結合所以右側優先運算,表現為 "運算元後置優先順序比較高" 的假象,前置和後置的區分是因為運算子過載而後加入c++的 接下來是算術運算子,*、/、%的優先順序當然比+、-高了。 移位運算子緊隨其後。 其次的關係運算子中,< <= > >=要比 == !

=高一個級別,不大好理解。 所有的邏輯操作符都具有不同的優先順序(單目運算子除外,!和~) 邏輯位操作符的"與"比"或"高,而"異或"則在它們之間。

跟在其後的&&比||高。 接下來的是條件運算子,賦值運算子及逗號運算子。 在c語言中,只有4個運算子規定了運算方向,它們是&&、| |、條件運算子及賦值運算子。

&&、| |都是先計算左邊表示式的值,當左邊表示式的值能確定整個表示式的值時,就不再計算右邊表示式的值。如 a = 0 && b; &&運算子的左邊位0,則右邊表示式b就不再判斷。 在條件運算子中。

如a?b:c;先判斷a的值,再根據a的值對b或c之中的一個進行求值。

賦值表示式則規定先對右邊的表示式求值,因此使 a = b = c = 6;成為可能。

編輯本段運算子優先順序等級口訣及註釋

運算子優先順序等級口訣

圓方括號、箭頭一句號, 自增自減非反負、針強地址長度, 乘除,加減,再移位, 小等大等、等等不等, 八位與,七位異,六位或,五與,四或,三疑,二賦,一真逗。 其中「,」號為一個等級分段。

運算子優先順序等級註釋

「圓方括號、箭頭一句號」指的是第15級的運算子。其中圓方括號很明顯「()、」,箭頭 指的是指向結構體成員運算子「->」,句號 指的是結構體成員運算子「.」 ; 「自增自減非反負、針強地址長度」指的是第14級的運算子。

其中 非 指的是邏輯運算子「!」,反 指的是按位取反運算子「~」,負 指的是負號運算子「-」,針 指的是指標運算子「*」,強 指的是強制型別轉換運算子,地址 指的是地址運算子「&」,長度 指的是長度運算子「sizeof 」; 「乘除,加減,再移位」移位指的是左移運算子「<<」和右移運算子「>>」,其中除法還包括了 取餘運算子「%」; 「小等大等、等等不等」 指的是第10級到第9級的運算子:<、<=、>和》=,等等指的是等於運算子==,不等指的是不等於運算子!

= 「八位與,七位異,六位或」其中 八位與 指的是第8級的 按位與 運算子「&」,七位異 指的是第7級的按位異或 運算子「^」,六位或 指的是第6級的按位或運算子「|」; 「五與,四或」指的是第5級、第4級的邏輯與運算子「&&」和邏輯或運算子「||」; 「三疑,二賦,一真逗」指的是第3級到第1級的運算子。其中,三疑指的是條件運算子「?:」 (三有雙重含義:

即指優先順序別是三,它的運算子型別也是三目,疑也取「?」之意),二賦 指的是賦值運算子=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=和|= ,一真逗 指的是第1級的「,」運算子,真字只是為了語句需要罷了。 由於c語言的運算子優先順序與c++的不完全一樣(主要是增加了幾個運算子),所以這個口訣不能完全實用於c++.

但是應該能夠相容,大家可以比較一下他們的區別應該就能夠很快掌握c++的優先順序的!

編輯本段運算子應用舉例

·賦值運算子:a=5; a=b=0; 第一個賦值語句把5賦給變數a;第二個賦值語句的意思是把0同時賦值給兩個變數。這是因為賦值語句是從右向左運算的,也就是說從右端開始計算,先b=0,然後a=b。

·複合賦值運算子:a=1;a+=3; 上面第二個賦值語句等價於a=a+3;即a=4。 ·算術運算子:

area=height*width;num=num1+num2/num3-num4; 第一個賦值語句height和width相乘結果賦給變數area;第二個賦值語句先完成num2與num3的整除運算,然後與num1相加,再減去num4,結果賦給num。運算子運算順序先算乘除再算加減。單目正和單目負最先運算。

·邏輯運算子:a=1,b=1; a||b-1; 因為a=1為真值,所以不管b-1是不是真值,總的表示式一定為真值,這時後面的表示式就不會再計算了。 ·關係運算子:

if(a>0)... 如果a>0,則執行if語句中的內容,否則退出。 ·條件運算子:

a=(b>0)?b:-b; 當b>0時,a=b;當b不大於0時,a=-b;其實上面的意思就是把b的絕對值賦值給a。

·逗號運算子:b=2,c=7,d=5;a=(++b,c--,d+3); 有三個表示式,用逗號分開,所以最終的值應該是最後一個表示式的值,也就是d+3=8,所以a=8。

c語言中左右結合性,怎麼理解?

4樓:志當存高遠

簡單說就是,從表示式右邊開始執行;

只有同優先順序的運算子才具有結合性「自左至右」或者「自右自左」一說。

exp(不同優先順序運算子,依據優先順序高低進行運算):

int a = 1, b =10, c = 30;

int a = a * b + c;

因為 * 比 + 的運算子優先順序高,所以

先計算a * b (先計算左邊,未考慮結合性),在計算 10 + c結果是 a = 300

exp(同優先順序運算子依據結合性進行運算):

int a, b = 1, c = 8;

a = b = c;

賦值運算子其結合性即為自右向左,即 a = ( b = c), 其結果是 b = 8, a = 8;

(錯誤答案:自左向右進行結合的話a = 1)

c語言中右結合性和右結合性是什麼意思

5樓:匿名使用者

舉個例子

a=b+c+d

=是右結合的,所以先計算

(b+c+d),然後再賦值給a

+是左結合的,所以先計算(b+c),然後再計算(b+c)+dc語言中具有右結合性的運算子包括所在單目運算子以及賦值運算子(=)和條件運算子。其它都是左結合性.

c語言中左右結合性什麼意思?

6樓:

其實很簡單,它就是同優先順序操作符在語句中的「運算優先順序(或叫順序)」。比如12/3*4,/和*是同優先順序操作符,先算12/3呢還是先算3*4呢?由於/和*都是左→右結合的,所以12/3*4就被解釋為(12/3)*4,而不會被解釋為12/(3*4)。

再比如當p是指標時的*p++,由於*和++同級別,它們又是右→左結合的,所以被解釋為*(p++)而不會被解釋為(*p)++。從以上可知,對於不同優先順序的操作符,結合性就起不到什麼作用了。個人理解,僅供參考。

c語言中的運算子優先順序和結合性c語言中指標運算子和自增運算子的優先順序

32個運算子 1級優先順序 左結合 圓括號 下標運算子 指向結構體成員運算子 結構體成員運算子 2級優先順序 右結合 邏輯非運算子 按位取反運算子 字首增量運算子 字首增量運算子 正號運算子 負號運算子 型別 型別轉換運算子 指標運算子 地址與運算子 sizeof 長度運算子 3級優先順序 左結合 ...

如何把素質教育和創新教育相結合,如何理解創新教育與素質教育?

創客教育是實現創新能力提升和創新人才培養的有效途徑。被認為是提升學生實踐力 力和創造力的很好方式。創客教育理念的核心在於通過動手實踐培養學生的創新意識 創新思維和創新能力,幫助學生解除課堂上帶來的約束,包括認知約束 課程約束 才能約束 領域約束和變化性約束。因此,創客教育不僅僅是一種活動形式,作為思...

如何理解中國夢的思想內涵,並結合自身談談個人夢想

們追復逐自己的夢,本身構成了 中國 制夢 的一塊塊基石.中國夢 的建構,又為我們放飛自己的夢想提供了平臺和土壤.當 中國夢 與個人夢同頻共振,二者都會加速綻放.一個人不怕一無所有,就怕沒有夢想,一個民族也是如此.結合自身實際談談你對中國夢的理解 夢想照進現實,關鍵在於行動 在於實幹。作為青年學子,要...