C 中的運算子和計算順序

2021-04-03 00:11:43 字數 2224 閱讀 3910

c++

中的運算子和計算順序

1.運算子和其優先順序

優先順序

運算子

結合律

( ) [ ] -> .

從左至右

! ~ ++ -- (型別)

sizeof + - * &

從右至左

* / %

從左至右

+ -

從左至右

<< >>

從左至右

<

<=   > >=

從左至右

== !=

從左至右

&

從左至右

^

從左至右

|

從左至右

&&

從左至右

||

從右至左 ?:

從右至左

= += -= *= /= %= &= ^= |= <<= >>=

從左至右

c++程式語言中說

++的後增(減)量(

lvalue++

)的優先順序大於

*。前增(減)量

(++lvalue)和*

的優先順序相同。

*p++

的意思是

*(p++)

,不是(*p)++

。這樣區別來對待前增量和後增量:

y=++x

相當於y=(x+=1)

,而y=x++

相當於y=(t,x+=1,t)

這樣的區別看起來相當不錯。

2.什麼是左值? 左值

(lvalue)

是可以被賦值的表示式。左值位於賦值語句的左側,以其相對的右值(

rvaule),

則位於賦值語句的右側。每條賦值語句都必須有乙個左值和乙個右值。左值必須是記憶體中乙個可儲存的變數,而不能是乙個常量。

左值能夠儲存表示式的結果:++x的結果儲存在x中所以它是左值。x++的結果不是放在x中的值,所以它不是左值。

右值是不可取址的,如常量,函式返回值,型別轉換結果;

int& u(); 它返回的是左值,(a=4)=28; //a=4是左值表示式。

3.求值順序

在乙個表示式裡,子表示式的求值順序是沒有定義的。特別的是,你不能假定表示式從左向右求值。 int x=f(3)+g(7) 沒有定義 f(),g()哪個先呼叫。

int i=1; v[i]=i++;

結果也是沒有定義的或者是v[1]=1,或者是v[2]=1。

但是有三種運算子的計算順序是有定義的:逗號(,),邏輯與(&&),邏輯或(| |)。它們保證了左邊的運算物件一定要先於右邊的運算物件計算。如:b=(a=2,a++)計算後把3賦給b。&&只有在第乙個運算物件為true時才算第二個。| |只有在第乙個運算物件是false時才算第二個,這叫短路求值

注意區分逗號的兩種用法:

f1(v[i],i++)

兩個引數;

f2( (v[i],i++) )

逗號表示式;

對於f2來說引數只有乙個相當於i++。

C 中 運算子 和 運算子

運算子定義在將可空型別分配給非可空型別時返回的預設值。int?c null 若 c 為 null,則 d 為 1,否則把 c 值賦予 d int d c 1 型別名稱後加問號,如 int?i null double?d null bool?b null 可指定可為 null 的 int double...

C 運算子順序

優先順序 運算子含義 結合方向1 域運算子 左 右2 括號,函式呼叫左 右 陣列下標運算子 指向成員運算子 成員運算子 自增運算子 後置 自減運算子 後置 3 自增運算子 前置 右 左 自減運算子 前置 按位取反運算子 邏輯非運算子 負號運算子 正號運算子 指標運算子 取位址運算子 型別 型別轉換運...

C 中的 和 運算子

和 運算子 構串操作符 構串操作符 只能修飾帶引數的巨集的形參,它將實參的字串行 而不是實參代表的值 轉換成字串常量 define string x x x x define text x class x info 巨集引用 int abc 100 string abc text abc 替換結果 ...