左值和右值:左值:用的是對象的身份(記憶體中的位置),右值:用的是對象的值(內容) 解引用與遞增(遞減)運算符連用: *ivec++:取ivec當前值並向後移動一個元素,等價於*(ivec++),本來++的優先順序高於* 條件運算符嵌套:(註意在語句兩端加上括弧,條件運算符優先順序極低) A?B:C?D: ...
左值和右值:左值:用的是對象的身份(記憶體中的位置),右值:用的是對象的值(內容)
解引用與遞增(遞減)運算符連用:
*ivec++:取ivec當前值並向後移動一個元素,等價於*(ivec++),本來++的優先順序高於*
條件運算符嵌套:(註意在語句兩端加上括弧,條件運算符優先順序極低)
A?B:C?D:E等價於A?B:(C?D:E)
位運算符(建議僅將位運算用於無符號類型,避免因符號位問題造成錯誤)
用法:
運算符 | 功能 | 用法 |
~ | 位求反 | ~exp |
<< | 左移 | exp1<<exp2 |
>> | 右移 | exp1>>exp2 |
& | 位與 | exp1&exp2 |
^ | 位異或 | exp1^exp2 |
| | 位或 | exp1|exp2 |
位運算的結果一旦超出位的範圍,超出部分的位將會被捨棄
<<操作符滿足左結合律
sizeof運算符:返回一條表達式或類型名所占的位元組數,返回值類型為size_t,滿足右結合律
sizeof(data.revenue);//獲取類對象data的revenue成員對應類型的大小
sizeof(arr);//獲取數組arr的類型大小,是其所有元素類型大小之和(利用sizeof(arr)/sizeof(*arr)可以獲取arr的元素數量
命名的強制類型轉換:cast-name<type>(expression),cast-name有4種:static_cast,dynamic_cast(後續章節再提),const_cast,reinterpret_cast
例如:
static_cast:
int j=10;
double slope=static_cast<double>( j ) / i;(只要不是底層const即可用,適用於將大類型賦給小類型)
void *vp=&d;
double *dp=static_cast<double*>(vp);
const_cast:
const char*pc;
char *p=const_cast<char*>(pc);(要求對象是底層const,藉此可以除掉const屬性(多用於重載函數),但是不能改變類型)
reinterpret_cast:"為運算對象的位模式提供較低層次的重新解釋",基本上用不到(極可能引起錯誤,慎用)
實際上強制類型轉換是迫不得已的手段,若非必要無需使用
運算符優先順序表見p147