今天去翻了下c語言運算子的優先順序和結合性,發現當初學習的時候就沒認真記住,慚愧。發現一篇講得不錯的文章,編輯了下轉來供以後翻閱。
c語言運算子優先順序表(由上至下,優先順序依次遞減)
運算子
結合性
() -> .
自左向右
! ~ ++ -- - (type) * & sizeof
自右向左
* / %
自左向右
+ -自左向右
<< >>
自左向右
< <= > >=
自左向右
== !=
自左向右 &
自左向右 ^
自左向右 |
自左向右 &&
自左向右 ||
自左向右 ?:
自右向左
assignments
自右向左 ,
自左向右
1、() -> .之類的理所當然是最優先的,其實它們壓根也不算什麼運算子了。
2、除了上面的四種運算子之外,接下來就是單目運算子,也就是! ~ ++ -- - (type) * & sizeof了。記住它們的順序可是自右向左啊!其實結合例項是很容易理解的,比如i++等。
3、接著是雙目運算子了,也是c語言運算子優先順序中最容易讓人混淆的地方了。其實也沒有那麼可怕,你認真觀察就會發現。在雙目運算子中,算術運算子優先順序最高,然後是移位運算子,接著是關係運算子,再著是邏輯運算子。不過這邊需要說的是,在關係運算子中,< <= > >=比== !=的優先順序來得高。此外,在邏輯運算子中,與運算又比或運算優先順序來得高,異或則處於二者之間。同樣的,你可以模擬出&&與||的優先順序關係。
4、在雙目操作符之後,就是三目操作符了,沒有什麼好說的了。
5、然後是賦值操作符,你也許會把賦值操作符與三目運算子的優先順序搞混。沒有關係,我想你一定寫過這樣的語句(如果沒有,請你記住!):max = (a>b)?a:b; ,從這個語句裡,你就不難記住賦值運算子為什麼比三目運算子的優先順序低了!
6、逗號運算子是分割各個子語句的(感覺這麼說有點不準確,不過我想大家會明白我的意思的),自然優先順序最低了,我想這個應該不是很容易混淆的。
總結一下,按運算子優先順序從高到低:單目運算子->雙目運算子->三目運算子->賦值運算子->逗號運算子 特別在雙目運算子中,按 運算子優先順序從高到低:算術運算子->移位運算子->關係運算子(其中==和!=優先順序又較低)->邏輯運算子(按位與-〉按位異或-〉按位或-〉邏輯與-〉邏輯或)!
運算子的結合性指同一優先順序的運算子在表示式中操作的組織方向,即:當乙個運算物件兩側運算子的優先級別相同時,運算物件與運算子的結合順序, c語言規定了各種運算子的結合方向(結合性)。大多數運算子結合方向是「自左至右」,即:先左後右,例如a- b+c, b兩側有-和+兩種運算子的優先順序相同,按先左後右結合方向, b先與減號結合,執行a- b的運算,再執行加c的運算。除了自左至右的結合性外, c語言有三類運算子參與運算的結合方向是從右至左。即:單目運算子,條件運算子,以及賦值運算子。關於結合性的概念在其他高階語言中是沒有的,這是c語言的特點之一。
++a或a++和--a或a--分別稱為前置加或後置加運算和前置減或後置減運算,都是單目運算子。值得注意的是,前置、後置運算只能用於變數,不能用於常量和表示式,且結合方向是從右至左。如當i=6時,求- i++的值和i的值。由於「- 」(負號) 「++」為同乙個優先順序,故應理解為- (i++),又因是後置加,所以先有-i++的值為-6,然後i增值1為7,即i=7。
例
1 main()
要得出c的值,首先要搞清+++的含義。++運算子的結合方向是自右向左的,如果將表示式理解為:c=a*b+(++b);實際上c編譯器將表示式處理為:c=(a*b++)+b,因為c編譯器總是從左至右盡可能多地將若干個字元組成乙個運算,
如i+++j等價於(i++)+j。接下來是解決a*b++的問題,因為++運算子的運算物件只能是整型變數而不能是表示式或常數,所以a*b++顯然是a*(b++)而非(a*b)++,因此整個表示式就是c=(a*(b++))+b,結果為c=20。
例
2 main()
例3 main()
j和m的值均由表示式求得,並且這兩個表示式均由自增運算子、加法運算子和賦值運算子組成。那麼,它們的值到底為多少呢? j=1+1+1=3還是j=1+2+3=6? m=2+3+4=9還是m=4+4+4=12?上機執行結果為: i=4,j=3,m=10(vc6.0)。分析:運算子「++」,「+」和「=」的優先順序是遞減的,在計算時,先進行自增運算,再進行加法運算,最後是賦值運算。而自增運算又根據「i++」和「++i」的不同定義得到不同的值。i+++i+++i++先將i原值(1)取出,作為表示式中i的值進行加法運算得到3,然後再實現三次自加; (++i)+(++i)+(++i)的計算與編譯器有關。
例4設a=6,求賦值表示式a+=a-=a-a*a的值。
由於「*」(乘號)、「- 」(減號)優先順序高於「+=」、「- =」,且「*」優先順序高於「- 」,故先求a- a*a,即6- 6*6=- 30,由「+=」,「-=」為同一優先順序,且是從右至左的結合方向,再求a- =- 30,即a=a- (- 30)=6+30=36,最後求a+=36,即a=a+36=36+36=72,所以賦值表示式的值為a=72。
例5設m=1,n=2,b=3,求賦值表示式m+=n-=---b的值。
這裡共有四個運算子「+=」、「-=」、「-」(負號)、「--」,由運算子優先順序,應先計算---b,但「--」與「-」(負號)優先順序相同,如按從右到左的結合方向,它可能是-(--b),也可能是--(-b),究竟是哪乙個呢?前面已講過,前置運算只能用於變數,不能用於表示式,而(-b)不是乙個變數,而是表示式,故只能是-(--b),即為-(3-1)=-2;然後計算n-=-2,即n=n-(-2)=2-(-2)=4;最後計算m+=4,即m=m+4=1+4=5,所以賦值表示式的值m=5。
當看到乙個複雜的c語言表示式時,首先應按優先順序進行運算,然後在同一優先順序中按結合方向進行運算。 **
C語言運算子優先順序及結合性
今天去翻了下c語言運算子的優先順序和結合性,發現當初學習的時候就沒認真記住,慚愧。發現一篇講得不錯的文章,編輯了下轉來供以後翻閱。c語言運算子優先順序表 由上至下,優先順序依次遞減 運算子 結合性 自左向右 type sizeof 自右向左 自左向右 自左向右 自左向右 自左向右 自左向右 自左向右...
C語言運算子優先順序及結合性
今天去翻了下c語言運算子的優先順序和結合性,發現當初學習的時候就沒認真記住,慚愧。發現一篇講得不錯的文章,編輯了下轉來供以後翻閱。c語言運算子優先順序表 由上至下,優先順序依次遞減 運算子 結合性 自左向右 type sizeof 自右向左 自左向右 自左向右 自左向右 自左向右 自左向右 自左向右...
運算子 優先順序 結合性
語言的運算子可分為以下幾類 1.算術運算子 用於各類數值運算。包括加 減 乘 除 求餘 或稱模運算,自增 自減 共七種。2.關係運算子 用於比較運算。包括大於 小於 等於 大於等於 小於等於 和不等於 六種。3.邏輯運算子 用於邏輯運算。包括與 或 非 三種。4.位操作運算子 參與運算的量,按二進位...