運算型別轉換
型別提公升過載運算子
左值和右值
等號兩邊的物件
優先順序和結合律
運算子的優先順序和運算順序(左結合律)
對於未制定求值順序的表示式,求值的時候產生的行為是未定義的。
cout << i << " " << i++ 4種明確了運算物件求值順序的運算子
運算物件的求值順序和優先順序與結合律無關。
c = f() + g() * h() +j();
優先順序規定g和h的返回值相乘
結合律規定f和g與hde乘積相加,在加上j;
對於這幾個函式的呼叫順序未規定。
如果這幾個函式對同乙個物件進行了修改,那麼將會產生未定義行為。
這個時候可以使用括號進行強制規定。
算術運算子
注意一點:
m%n的運算定義:如果m,n是整數且n非0,所以可以推出來表示式(m/n)*n+m%n與m相等
m%(-n) = m%n;
(-m)%n = -(m%n);
可以記作符號隨m。這一點和乘除法不一致。
關係運算子
短路求值
賦值運算子
始終注意賦值運算子的優先順序較低。0
注意:c++中混用後置遞增運算子和解引用運算子。
auto p = a.begin();
cout << *p++《使用p當前的值,並將指標後移。
運算子物件可以按照任意順序求值
for(auto i = a.begin();i!=a.end();++i)
*i = toupper(*i++)
//上述行為是未定義的;
//編譯器可能採用下述任意一種順序
*i = toupper(*i),i++;
*(i++) = toupper(*i);
//或者其他任何方式。
sizeof運算子
逗號運算子
從左到右依次計算。
發生情況:
算術轉換運算子的運算物件會自動轉換為最寬的型別。
整型提公升
小整型會轉換為較大整型,int
較大的char型別會轉換為int,unsinged int;long;unsigned long;long long;unsigned long long
其他隱式型別轉換
陣列轉換為指標。
指標轉換為bool值
類型別的轉換(參考c++ primer plus 的轉換建構函式)
c型別的強制型別轉換。
double a =
10.9
;double b =
18.8
;int c =
(int
)a +
(int
)b;
c++型別轉換
類似於cast-name< type>(expression)
type是要轉換的目標型別,
expression是要轉換的表示式,
cast-name是static_cast;dynamic_cast;const_cast;reinterpret_cast中的乙個;cast_name指定了將要進行那種轉換。
static_cast
任何具有明確定義的型別轉換,只要不包含底層const,就可以使用static_cast;
double i =
100.098
;double j =
12.234
;int c = static_cast<
double
>
(i)/ j;
const_cast
用於改變運算物件的底層const
int a =10;
const
int*
const p =
&a;int
* c = const_cast<
int*
>
(p);
*c =
210;
cout <<
*p;
最終輸出 210;
強制獲得寫的許可權
reinterpret_cast
在底層對物件提供重新解釋。
dynamic_cast
涉及類和虛函式的轉換。
c 基礎 表示式樹
在linq to objects中,擴充套件方法需要將乙個委託型別作為引數,這樣就可以將lambda表示式賦予引數。lambda表示式也可以賦予expression型別的引數。c 編譯器根據型別給lambda表示式定義不同的行為。如果型別是expression,編譯器就從lambda表示式中建立乙個...
js基礎 表示式與變數
表示式 1.原始表示式 常量 直接量 關鍵字 變數 3.14 test null i k j 2.初始化表示式 1,2 3.函式表示式 var fe function function 4.屬性訪問表示式 var o o.x o x 5.呼叫表示式 func 6.物件建立表示式 new func 1...
C 基礎表示式和運算子
1.什麼是表示式?表示式是由運算子和運算元組組成的。運算子設定對運算元進行什麼樣的運算。在c 中,如果表示式最終的計算結果為所需的型別值,表示式就可以出現在需要自或物件的任意位置。在c 中,如果表示式最終的計算結果為所需的型別值,表示式就可以出現在需要自或物件的任意位置。2.什麼是算術運算子?算術運...