C C 中操作符的優先順序和求值順序

2021-07-04 22:12:52 字數 2655 閱讀 2375

今天在看《the c puzzle book》時,又看到了從一開始學c語言就一直被反覆強調的問題:操作符優先順序和求值順序。也許平時大家都不太注意這個問題——的確,當不清楚優先順序關係 時,可以直接使用圓括號來」手動「決定優先順序——所以優先順序通常都不會引起大家的注意。然而,在《the c puzzle book》中,幾個非常巧妙的例子卻說明了,如果能讓優先順序順序了然於心,那麼便能夠寫出很簡潔很漂亮的**。

1:int x;    x = - 3 * 4 % - 6 / 5;    —— x = (((-3) * 4) % (-6)) / 5;

因為「*」和「%」和「/」的優先順序是一樣的,且結合順序是自左向右。

2:int x = 2, y = 1, z = 0;    z += - x ++ + ++ y;    —— z += (-(x++)) + (++y);

因為「++」和「--」的優先順序要高於負號(「++」和「--」只對左值有效)。

3:int x = 1, y = 1, z = 1;    z += x < y ? x ++ : y ++;    —— z += (x < y ? (x++) : (y++));

因為「+=」的優先順序僅高於「,」。

4:int x = 3, y = 4, z = 4;    (z >= y > = x) ? 1 : 0;    —— ((z >= y) > = x) ? 1 : 0;

因為「>=」的結合順序是自左向右。

5:int x = 1, y = 1, z = 1;    ++x || ++y && ++z;    —— ++x || (++y && ++z);

因為「++x」始終為真,由於「||」的短路,後面的表示式將不被計算。所以只有x變成了2。

附上操作符優先順序表,便於以後查閱:

優先順序運算子

名稱或含義

使用形式

結合方向說明1

陣列下標

陣列名[常量表示式]

左到右()

圓括號(表示式)/函式名(形參表)

.成員選擇(物件)

物件.成員名

->

成員選擇(指標)

物件指標->成員名2-

負號運算子

-表示式

右到左單目運算子

(型別)

強制型別轉換

(資料型別)表示式

++自增運算子

++變數名/變數名++

單目運算子

--自減運算子

--變數名/變數名--

單目運算子

*取值運算子

*指標變數

單目運算子

&取位址運算子

&變數名

單目運算子

!邏輯非運算子

!表示式

單目運算子

~按位取反運算子

~表示式

單目運算子

sizeof

長度運算子

sizeof(表示式)3/

除表示式/表示式

左到右雙目運算子*乘

表示式*表示式

雙目運算子

%餘數(取模)

整型表示式/整型表示式

雙目運算子4+

加表示式+表示式

左到右雙目運算子-減

表示式-表示式

雙目運算子

5<<

左移變數《表示式

左到右雙目運算子

>>

右移變數》表示式

雙目運算子

6>

大於表示式》表示式

左到右雙目運算子

>=

大於等於

表示式》=表示式

雙目運算子

<

小於表示式《表示式

雙目運算子

<=

小於等於

表示式<=表示式

雙目運算子7==

等於表示式==表示式

左到右雙目運算子

!=不等於

表示式!= 表示式

雙目運算子8&

按位與表示式&表示式

左到右雙目運算子9^

按位異或

表示式^表示式

左到右雙目運算子10|

按位或表示式|表示式

左到右雙目運算子

11&&

邏輯與表示式&&表示式

左到右雙目運算子

12||

邏輯或表示式||表示式

左到右雙目運算子

13?:

條件運算子

表示式1? 表示式2: 表示式3

右到左三目運算子14=

賦值運算子

變數=表示式

右到左/=

除后賦值

變數/=表示式

*=乘後賦值

變數*=表示式

%=取模後賦值

變數%=表示式

+=加後賦值

變數+=表示式

-=減後賦值

變數-=表示式

<<=

左移後賦值

變數<<=表示式

>>=

右移後賦值

變數》=表示式

&=按位與後賦值

變數&=表示式

^=按位異或後賦值

變數^=表示式

|=按位或後賦值

變數|=表示式15,

逗號運算子

表示式,表示式,…

左到右從左向右順序運算

C C 中「 」操作符和「後 」操作符的優先順序

假設有如下的定義 char carr char cp carr 那麼表示式 cp 的右值是什麼呢?這個表示式在陣列遍歷的程式中非常常見,但我對於這個表示式的理解有些偏差,我一直認為它和下面的表示式是等價的。cp cp 即先對cp進行解引用操作,然後使cp指向陣列的下乙個位置。雖然說最終的結果是一樣的...

操作符優先順序

操作符優先順序 優先順序運算子 名稱或含義 使用形式 結合方向說明1 陣列下標 陣列名 常量表示式 左到右 圓括號 表示式 函式名 形參表 成員選擇 物件 物件.成員名 成員選擇 指標 物件指標 成員名2 負號運算子 表示式 右到左單目 型別 強制型別轉換 資料型別 表示式 自增運算子 變數名 變數...

操作符優先順序

優先順序 運算子含 義 要求運算 物件的個數 結合方向1 圓括號 下標運算子 指向結構體成員運算子 結構體成員運算子 自左至右2 邏輯非運算子 1 單目運算子 自右至左 按位取反運算子 自增運算子 自減運算子 負號運算子 型別 型別轉換運算子 指標運算子 位址與運算子 sizeof 長度運算子 3 ...