第4章:表達式
4.1 基礎(chǔ)
基本內(nèi)容:
- 一元運算符、二元運算符、三元運算符、函數(shù)調(diào)用(特殊的運算符)。
- 運算符的優(yōu)先級和結(jié)合律,運算對象的求值順序。
- 運算對象轉(zhuǎn)換,重載運算符,左值和右值。
備注:
- 左值使用對象的身份(位置),右值使用對象的值(內(nèi)容)。左值可替換右值,反之不行。
- 明確求值順序的4個運算符:與(&&) ,或(|| ),條件(?: ),逗號(,)。
4.2 算術(shù)運算符
基本內(nèi)容:
- 一元正號(+)、一元負號(-)。
- 乘(*)、除(/)、取余(%)。
- 加(+)、減(-)。
備注:
- 算術(shù)運算符滿足左結(jié)合律,其運算對象和求值結(jié)果都是右值。
- 布爾值不應(yīng)參與運算。
- 算術(shù)表達式可能因為除數(shù)為0或溢出等情況產(chǎn)生未定義結(jié)果。
- 除法會刪除余數(shù),商一律向0取值;取余的運算對象必須是整數(shù),m%(-n)等價于m%n,(-m)%n和(-m)%(-n)等價于-(m%n) 。
4.3 邏輯和關(guān)系運算符
基本內(nèi)容:
- 邏輯非(!)。
- 小于(<),小于等于(<=),大于(>),大于等于(>=).
- 相等(=),不相等(!=)。
- 邏輯與(&&)。
- 邏輯或(||)。
備注:
- 除邏輯非(!)是右結(jié)合律外,其它邏輯和關(guān)系運算符都是左結(jié)合律。所有邏輯和關(guān)系運算符的運算對象和求值結(jié)果都是右值。
- 邏輯與(&&)和邏輯或(||)使用短路求值(只有左側(cè)對象無法推出結(jié)果時才會計算右側(cè)對象)。
- 引用類型可避免對過大元素的拷貝。
- 比較運算時,除非比較對象是布爾型,否則不要用true和false。
4.4 賦值運算符
基本內(nèi)容:
- 賦值(=)。
- 符合賦值運算符(+=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=)
備注:
- 賦值運算符滿足右結(jié)合律,賦值運算結(jié)果是左側(cè)運算對象,它是一個可修改的左值。
- 初始化!=賦值。若左側(cè)運算對象是內(nèi)置類型,賦值時初始值列表最多包含一個值,而初始化可以是多個。如int i1[3] = {1, 2, 3};是對的,int i2[3];i2 = {1, 2, 3};是錯的。
- 復(fù)合運算符等價于a = a op b;
4.5 遞增和遞減運算符
基本內(nèi)容:
- 遞增(++),遞減(--)。
- 前置版本將對象本身作為左值返回,后置版本將對象原始值的副本作為右值返回。
備注:
- 除非必須,否則不要使用后置版本。因為后置版本需存儲原始值作為返回值,編譯器開銷更大。
- 后置遞增(遞減)運算符優(yōu)先級>解引用運算符。*p++等價于*(p++)。
4.6 成員訪問運算符
基本內(nèi)容:
- 點運算符(.), 箭頭運算符(->)。
- ptr->men等價于(*ptr).men。
- 優(yōu)先級:點運算符、箭頭運算符 > 遞增遞減運算符 > 解引用運算符。
4.7 條件運算符
基本內(nèi)容:
- 條件運算符(?:)
- 條件運算符形式:cond ? exp1 : exp2。若cond 為真則執(zhí)行exp1 ,否則執(zhí)行exp2。
- 條件運算的嵌套層數(shù)最好不超過兩到三層。
4.8 位運算符
基本內(nèi)容:
- 位求反(~)。
- 左移(<<),右移(>>)。
- 位與(&)。
- 位異或(^)。
- 位或(|)
備注:
- 位運算符的運算對象是整型,用于設(shè)置和檢查二進制位。
- 位運算符盡量只用于處理無符號整數(shù),有符號整數(shù)的符號位無明確處理方法,具體依賴于機器。
- 移位運算符(<<和>>)滿足左結(jié)合律,右側(cè)運算對象不能為負,且小于結(jié)果位數(shù)。
4.9 sizeof運算符
基本內(nèi)容:
- sizeof運算符形式:sizeof (type) 或sizeof expr。
- sizeof滿足右結(jié)合律,與解引用運算符優(yōu)先級相同。
4.10 逗號運算符
基本內(nèi)容:
- 逗號運算符先算左側(cè)表達式,丟棄其結(jié)果,再算右側(cè)表達式,返回其結(jié)果。
4.11 類型轉(zhuǎn)換
基本內(nèi)容:
- 隱式轉(zhuǎn)換:算術(shù)轉(zhuǎn)換,整型提升,無符號類型轉(zhuǎn)換,數(shù)組轉(zhuǎn)指針,指針間轉(zhuǎn)換,轉(zhuǎn)換成布爾類型,轉(zhuǎn)換成常量,類類型定義轉(zhuǎn)換。
- 顯式轉(zhuǎn)換:static_cast, dynamic_cast, const_cast, reinterpret_cast。
備注:
- 避免強制類型轉(zhuǎn)換。