表達(dá)式由一個(gè)或多個(gè)運(yùn)算對(duì)象(operand)組成,對(duì)表達(dá)式求值將得到一個(gè)結(jié)果。字面值和變量是最簡(jiǎn)單的表達(dá)式,其結(jié)果就是字面值和變量的值。
- C++語言定義了運(yùn)算符作用于內(nèi)置類型和復(fù)合類型的運(yùn)算對(duì)象時(shí)所執(zhí)行的操作。當(dāng)運(yùn)算符作用于類類型的運(yùn)算對(duì)象時(shí),用戶可以自行定義其含義,稱之為重載運(yùn)算符。IO庫(kù)的>>和<<運(yùn)算符以及string對(duì)象,vector對(duì)象和迭代器使用的運(yùn)算符都是重載的運(yùn)算符。
- 復(fù)合表達(dá)式是指有兩個(gè)或多個(gè)運(yùn)算符的表達(dá)式。求復(fù)合表達(dá)式的值需要將運(yùn)算符和運(yùn)算對(duì)象合理地組合在一起,優(yōu)先級(jí)和結(jié)合律決定了運(yùn)算對(duì)象組合的方式。也就是決定了表達(dá)式中每個(gè)運(yùn)算符對(duì)應(yīng)的運(yùn)算對(duì)象來自表達(dá)式的哪一部分。
- 優(yōu)先級(jí)規(guī)定了運(yùn)算對(duì)象的組合方式,但是沒有說明運(yùn)算對(duì)象按照什么順序求值。比如:
int i=f1()*f2();
int i=0;
cout<<i<<" "<<++i<<endl;
我們無法知道f1和f2之間的調(diào)用順序,同時(shí)也無法知道是先求++i的值還是先求i的值,這樣的行為是未定義的,不可預(yù)知的。
- 如果改變了某個(gè)運(yùn)算對(duì)象的值,在表達(dá)式的其他地方不要再使用這個(gè)運(yùn)算對(duì)象。除非改變運(yùn)算對(duì)象的子表達(dá)式本身就是另外一個(gè)子表達(dá)式的運(yùn)算對(duì)象。
- 進(jìn)行比較運(yùn)算時(shí)除非比較的對(duì)象是布爾類型,否則不要使用布爾字面值true和false作為運(yùn)算對(duì)象。
- 賦值運(yùn)算符滿足右結(jié)合律
- 除非必須,否則不用自增自減運(yùn)算符的后置版本,因?yàn)楹笾冒姹拘枰?strong>將原始值存儲(chǔ)下來以便返回。
- 形如*pbeg++的表達(dá)式是一種被廣泛使用且有效的寫法,表示先移動(dòng)指針/迭代器,再取原來指向的對(duì)象。
- 解引用運(yùn)算符*的優(yōu)先級(jí)低于點(diǎn)運(yùn)算符。
- sizeof運(yùn)算符(這是一個(gè)關(guān)鍵字)返回一條表達(dá)式或一個(gè)類型名字所占的字節(jié)數(shù)。sizeof運(yùn)算符滿足右結(jié)合律,其所得的值是一個(gè)size_t類型的常量表達(dá)式,運(yùn)算符的運(yùn)算對(duì)象有兩種形式:
- sizeof (type)
- sizeof expr
對(duì)數(shù)組執(zhí)行sizeof運(yùn)算得到整個(gè)數(shù)組所占空間的大小,等價(jià)于對(duì)數(shù)組中所有元素各執(zhí)行一次sizeof運(yùn)算并將所得結(jié)果求和。注意,sizeof運(yùn)算不會(huì)把數(shù)組轉(zhuǎn)換成指針來處理。
所以可以用數(shù)組的大小除以單個(gè)元素的大小得到數(shù)組中元素的個(gè)數(shù):
constexpr size_t sz=sizeof(ia)/sizeof(*ia);
sizeof的返回值是一個(gè)常量表達(dá)式,所以我們可以用sizeof的結(jié)果聲明數(shù)組維度。
- 對(duì)于算術(shù)隱式轉(zhuǎn)換來說,可以簡(jiǎn)單地理解為往更大的類型轉(zhuǎn)換。
- 在大多數(shù)用到數(shù)組的表達(dá)式中,數(shù)組自動(dòng)轉(zhuǎn)換成指向數(shù)組首元素的指針。當(dāng)數(shù)組被用作decltype關(guān)鍵字參數(shù),或者作為取地址符(&),sizeof及typeid等運(yùn)算符的運(yùn)算對(duì)象時(shí),上述轉(zhuǎn)換不會(huì)發(fā)生。
- 類類型能定義由編譯器自動(dòng)執(zhí)行的轉(zhuǎn)換,比如C風(fēng)格字符串轉(zhuǎn)換成string,在條件部分讀入istream等。
- 一個(gè)命名的強(qiáng)制類型轉(zhuǎn)換具有以下形式:cast-name<type>(expression);
- static_cast:任何具有明確定義的類型轉(zhuǎn)換,只要不包含底層const
- const_cast: 只能改變運(yùn)算對(duì)象的底層const
- reinterpret_cast:為運(yùn)算對(duì)象的位模式提供重新解釋(比如把int *解釋成char *)
- 避免使用強(qiáng)制類型轉(zhuǎn)換
- 在早期版本的C++語言中,顯式地進(jìn)行強(qiáng)制類型轉(zhuǎn)換包含兩種形式:
- type (expr); 函數(shù)形式的
- (type) expr; C語言風(fēng)格的