左值和右值
簡單歸納:當乙個物件被用作右值的時候,用的是物件的值(內容)。當物件被用作左值的時候,用的是物件的身份(在記憶體中的位置)。
不是很理解,日後補上
取餘運算
-21 % -8 ; // -5
21 % -5 ; // 1
窄化轉換
可以使用花括號來對物件初始化。但是要注意,對於內建型別,如果用花括號初始化,如果存在丟失資料的風險,編譯器將報錯。
int k;
k = ; //錯誤:窄化轉換
多重賦值語句int ival, *pval;
ival = pval = 0; //錯誤,賦值語句會返回左側物件,右結合律,pval=0返回了指標,無法被轉換成int
除非必須(需要用到原始值),遞增遞減運算子最好使用前置版本。這樣可以提公升效能。因為後置版本需要儲存原始值,這種額外的工作在內建型別來說影響還不是很大,但是對於型別複雜的迭代器型別,這種額外的工作就消耗更大了。
對於*****解引用運算子和遞增遞減運算子,遞增遞減運算子優先順序更高。看下面一段**,注意這種普遍寫法。
auto pbeg = v.begin();
//輸出元素直到遇到第乙個負值為止
while(pbeg != v.end() && *beg >= 0)
cout << *pbeg++ << endl; //先把pbeg原來的值賦值給返回和解引用結合,輸出當前值。然後再給pbeg遞增。
在輸出表示式中使用條件運算子
正常情況下,想實現的運算如下:
cout << ((grade < 60) ? "fail" : "pass") ; //輸出"fail"或"pass"
括號沒有使用好:
cout << (grade < 60) ? "fail" : "pass" ; //輸出0或1
在這種情況下還不是錯誤,這裡是先進行grade < 60比較,得到***0***或***1***。然後***cout***輸出,返回乙個cout物件。此時的表示式變成了:cout ? 「fail」 : 「pass」 ;返回的cout的值決定著輸出。
下面是括號沒有使用好的錯誤情況:
cout << grade < 60 ? "fail" : "pass" ; //錯誤,依據優先順序,從左到右,試圖比較cout和60
移位運算子
***char***型別移位,會被提公升成為***int***型然後再移位。
位求反運算子
***char***型別求反,會被提公升成為***int***型然後再求反。
sizeof運算物件有兩種形式:
sizeof(type);
sizeof(expr);
其中有一些比較特別的:
//q:sizeof運算子與string物件或vector物件
void e2();
cout << "sizeof(a):" << sizeof(a) << endl; //24,不管vector內容怎麼變,固定部分是24b。
}
static_cast
任何具有明確定義的型別轉換,只要不包含底層const,都可以使用***static_cast***。
//q:型別轉換**
void e3()
const_cast
const_cast只能改變運算物件的底層const。
const char *pc;
char *p = const_cast(pc);
reinterpret_cast
reinterpret_cast通常為運算物件的位模式提供較低層次上的重新解釋。
int *ip;
char *pc = reinterpret_cast(ip);
以前學c時的記錄:
單目 - 算術 - 移位 - 關係 - 邏輯 - 賦值
c primer第四章 表示式
左值 右值 當乙個物件被當做右值的時候使用的是物件的值 內容 當物件被用作左值的時候用的是物件的身份 記憶體 原則 在使用右值的地方可以用左值代替,但是不能把右值當成左值 也就是位置 使用。當乙個左值被用工作右值時,實際上使用的是她的內容 值 1.賦值運算需要乙個左值作為左側運算物件,得到結果仍然是...
C Primer 第四章 表示式
表示式由乙個或多個運算物件組成,對表示式求值將得到乙個結果。字面值和變數時最簡單的表示式,其結果就是字面值和變數的值。把乙個運算子和乙個或多個運算物件結合起來可以生成複雜的表示式。4.1.1 基本概念 4.1.2 優先順序與結合律 4.1.3 求值順序 這部分需要參考加減乘除等運算的先後順序,在此不...
c primer第四章表示式小結 4
第四章 表示式 1.c 語言提供了兩種類似於 vector 和迭代器型別的低階復合型別 陣列和指標。與 vector 型別相似,陣列也可以儲存某種型別 的一組物件 而它們 的區別在於,陣列 長度是固定的。陣列一經建立,就不允許新增新的元素。不允許陣列直接複製和賦值,陣列 的長度是固定的。2.指標 可...