[C++ Primer Note3] 表達(dá)式

表達(dá)式由一個(gè)或多個(gè)運(yùn)算對(duì)象(operand)組成,對(duì)表達(dá)式求值將得到一個(gè)結(jié)果。字面值變量是最簡(jiǎn)單的表達(dá)式,其結(jié)果就是字面值和變量的值。

  1. 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)算符。
  2. 復(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á)式的哪一部分。
  3. 優(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ù)知的。

  1. 如果改變了某個(gè)運(yùn)算對(duì)象的值,在表達(dá)式的其他地方不要再使用這個(gè)運(yùn)算對(duì)象。除非改變運(yùn)算對(duì)象的子表達(dá)式本身就是另外一個(gè)子表達(dá)式的運(yùn)算對(duì)象。
  2. 進(jìn)行比較運(yùn)算時(shí)除非比較的對(duì)象是布爾類型,否則不要使用布爾字面值true和false作為運(yùn)算對(duì)象。
  3. 賦值運(yùn)算符滿足右結(jié)合律
  4. 除非必須,否則不用自增自減運(yùn)算符的后置版本,因?yàn)楹笾冒姹拘枰?strong>將原始值存儲(chǔ)下來以便返回。
  5. 形如*pbeg++的表達(dá)式是一種被廣泛使用且有效的寫法,表示先移動(dòng)指針/迭代器,再取原來指向的對(duì)象。
  6. 解引用運(yùn)算符*的優(yōu)先級(jí)低于點(diǎn)運(yùn)算符。
  7. 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ù)組維度。

  1. 對(duì)于算術(shù)隱式轉(zhuǎn)換來說,可以簡(jiǎn)單地理解為往更大的類型轉(zhuǎn)換。
  2. 在大多數(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ā)生。
  3. 類類型能定義由編譯器自動(dòng)執(zhí)行的轉(zhuǎn)換,比如C風(fēng)格字符串轉(zhuǎn)換成string,在條件部分讀入istream等。
  4. 一個(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 *)
  1. 避免使用強(qiáng)制類型轉(zhuǎn)換
  2. 在早期版本的C++語言中,顯式地進(jìn)行強(qiáng)制類型轉(zhuǎn)換包含兩種形式:
  • type (expr); 函數(shù)形式的
  • (type) expr; C語言風(fēng)格的
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,661評(píng)論 1 51
  • #1.基礎(chǔ)1.1 基本概念1.2 優(yōu)先級(jí)和結(jié)合律1.3 求值順序 #2.算術(shù)運(yùn)算符 #3.邏輯和關(guān)系運(yùn)算符 #4....
    MrDecoder閱讀 401評(píng)論 0 0
  • 3. 類設(shè)計(jì)者工具 3.1 拷貝控制 五種函數(shù)拷貝構(gòu)造函數(shù)拷貝賦值運(yùn)算符移動(dòng)構(gòu)造函數(shù)移動(dòng)賦值運(yùn)算符析構(gòu)函數(shù)拷貝和移...
    王偵閱讀 2,063評(píng)論 0 1
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,535評(píng)論 0 13
  • 2016,你幸福嗎? 2016年是十分平淡的一年,乏善可陳,但流年清寄給我很多感動(dòng),我笑顏清歡,感激所有的美好。 ...
    樹小洞2閱讀 380評(píng)論 0 0

友情鏈接更多精彩內(nèi)容