左值、右值:
當乙個物件被當做右值的時候使用的是物件的值(內容),當物件被用作左值的時候用的是物件的身份(記憶體);
原則:在使用右值的地方可以用左值代替,但是不能把右值當成左值(也就是位置)使用。當乙個左值被用工作右值時,實際上使用的是她的內容(值)。
1.賦值運算需要乙個左值作為左側運算物件,得到結果仍然是左值
2. 取位址符作用於乙個左值物件,返回乙個指向該物件的指標,這個指標是右值
3. 內建解引用運算子、下標運算子,迭代器解引用運算子,string、vector的下標運算子的求值結果都是左值
4. 內建型別和迭代器的遞增遞減運算子作用於左值運算物件,其前置版本所得結果也是左值
使用decltype時候,左值右值也有所不同,如果表示式求值結果是左值,decltype作用於該表示式得到乙個引用型別。設p是乙個 int * ,解引用得到左值,所以decltype( * p) 的結果是int&;另一方面,取位址得到右值,所以decltype(&p)得到int * *
4.1.3求值順序
1. 邏輯與&& 運算子先求左側物件的的值,左側為真時才繼續求右側物件的值
2. 邏輯或 || 運算子也是先求左側物件的的值,當且僅當左側運算物件無法確定表示式結果時(為假)才繼續求右側物件的值;這種策略稱為短路求值。
3. 條件運算子 (?:)cond?expr1:expr2;
cond為真時求expr1的值並返回該值,否則計算expr2並返回;當倆個表示式都是左值或者都能轉換成同一種左值型別時,運算結果是左值,否則 運算結果是右值;
4. 逗號運算子(,)先求左側表示式的值然後丟棄掉,逗號運算子的真正結果是右側表示式的值,右側物件是右值就是右值,否則就是左值
運算物件的求值順序與優先順序和結合律無關
建議:
1.拿不準的時候最好使用括號來強制讓表示式組合關係符合程式邏輯要求
2.如果改變了某個運算物件的值,在表示式的其他地方就不要再使用該物件;2的乙個列外是,當改變運算物件的字表示式本身就是另外乙個字表示式的的運算物件時該規則無效
賦值運算子滿足右結合律
4.5遞增遞減運算子
前置版本 ++i (–i)和 後置版本 i++(i–)
* 前置版本先把物件加1(或減1),然後將改變的物件作為求值結果;後置版本也把物件加1(或減1),但是求值結果式運算物件改變之前那個值的副本
int i=0,j;
j=++i;//i=1,j=1;得到遞增之後的值
j=i++;//j=1,i=2;後置版本得到遞增之前的值
建議:除非必須,否則不用遞增遞減運算子的後置版本(後置版本還要儲存修改前的值)
在一條語句混用解引用和遞增運算子:如果既想使用原來的值又想遞增變數就可以使用後置版本
auto pbeg=v.begin();
while(pbeg!=v.end()&&*pbeg>=0)
cout << *pbeg++;//輸出當前值,並向前移動乙個元素
如果一條表示式改變了變數的值而另一條表示式要使用該值,運算順序就很關鍵了
成員訪問運算子:點運算子 箭頭運算子
ptr->mem;相當於(*ptr).mem
string s=」a strig」, *p= & s;
auto n=s.size();
n=(*p).size();
n=p->size();
sizeof運算子返回乙個表示式或者乙個型別名字所佔的位元組數,滿足右結合律,返回型別size_t
兩種形式:
sizeof(type)
sizeof expr;
第二種形式中,sizeof返回的是表示式結果型別的大小
sales_data data ,*p;
sizeof(sales_data); // 儲存sales_data 型別的物件所佔的空間
sizeof data;//data型別的大小,同上
sizeof p;//指標所佔空間大小;
sizeof *p;//p所指型別的大小
* 對char或者型別為char的表示式執行sizeof,結果是1;
* 對引用型別執行sizeof得到的是引用物件所佔空間大小
* 對指標執行sizeof得到的是指標本身所佔空間大小
* 對解引用執行sizeof運算得到指標指向的物件所佔空間大小,指標不需要有效;
* 對陣列執行sizeof得到整個陣列所佔空間大小 ,等價於對陣列所有物件執行一次sizeof並將結果相加求和,sizeof不會把陣列當做指標來運算
* 對string或者vector執行sizeof運算只返回該型別固定部分的大小,不會計算物件中元素佔了多少空間
sizeof(ia)/sizeof( *a)得到陣列中元素的個數
C Primer 第四章 表示式
表示式由乙個或多個運算物件組成,對表示式求值將得到乙個結果。字面值和變數時最簡單的表示式,其結果就是字面值和變數的值。把乙個運算子和乙個或多個運算物件結合起來可以生成複雜的表示式。4.1.1 基本概念 4.1.2 優先順序與結合律 4.1.3 求值順序 這部分需要參考加減乘除等運算的先後順序,在此不...
C Primer小記 第四章 表示式
左值和右值 簡單歸納 當乙個物件被用作右值的時候,用的是物件的值 內容 當物件被用作左值的時候,用的是物件的身份 在記憶體中的位置 不是很理解,日後補上 取餘運算 21 8 5 21 5 1窄化轉換 可以使用花括號來對物件初始化。但是要注意,對於內建型別,如果用花括號初始化,如果存在丟失資料的風險,...
c primer第四章表示式小結 4
第四章 表示式 1.c 語言提供了兩種類似於 vector 和迭代器型別的低階復合型別 陣列和指標。與 vector 型別相似,陣列也可以儲存某種型別 的一組物件 而它們 的區別在於,陣列 長度是固定的。陣列一經建立,就不允許新增新的元素。不允許陣列直接複製和賦值,陣列 的長度是固定的。2.指標 可...