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 替換結果 ...