#C++ Primer Plus# 第三章 處理數據

  • 面向對象編程(OOP)的本質:設計并擴展自己的數據類型
  • 內置C++數據類型


    C++數據類型
  • 標識存儲的數據的方法:使用變量
  • C++中的算術運算
  • C++中的類型轉換

3.1 簡單變量

信息存儲的三個基本屬性:

  • 信息將存儲在哪里
  • 要存儲什么值
  • 存儲何種類型的信息

3.1.1 變量名

C++變量命名規則:

  • 在名稱中只能使用字母字符、數字和下劃線(_)
  • 名稱的第一個字符不能是數字
  • 區分大小寫字符
  • 不用使用C++關鍵字作為名稱
  • 以兩個下劃線或下劃線和大寫字母打頭的名稱將被保留給實現(編譯器及其使用的資源)使用。以一個下劃線開頭的名稱被保留給實現,用作全局標識符(名稱被聲明的位置)
  • C++對于名稱的長度沒有限制,名稱中所有的字符都有意義,但有些平臺有長度限制。(ANSI C只保證名稱中的前63個字符有意義)

多個單詞組成名稱的處理方法:

  • 使用下劃線字符分開單詞(C程序員慣用)
  • 從第二個單詞開始首字母大寫(Pascal程序員慣用)

3.1.2 整型

  • 語言只能表示所有整數的一個子集
  • 不同C++整型使用不同的內存量來存儲整數,使用的內存量越大,可表示的整數范圍就越大

3.1.3 整型short、int、long、long long

  1. C++確保這些類型的最小長度:

    • short至少16位
    • int至少與short一樣長
    • long至少32位,且至少與int一樣長
    • long long至少64位,且至少與long一樣長
  2. 位:計算機內存的基本單元,每一位都有0/1兩種可能。

  3. 字節:8位的內存單元。

  4. C++字節:由至少能夠容納實現的基本字符集的相鄰位組成,即可能的取值數目必須等于或超過字符總數。在使用ASCII碼的系統中,一個字節表示8位;在使用Unicode的系統中,一個字節表示16或32位。

  5. short是short int的簡稱,long是long int的簡稱

  6. sizeof運算符返回類型或變量的長度,對類型名,將名稱放在括號中;對變量名,括號是可選的。eg:sizeof(int); sizeof n_short;

  7. 頭文件climits定義了表示各種限制的符號名稱,比如 INT_MAX

  8. #define INT_MAX 32767#define是一個預處理器編譯指令,它查找獨立的token(單獨的單詞),跳過嵌入的單詞,進行替換

  9. 變量初始化的三種方式:

    • int owls = 101; // 來自C語言
    • int wrens(432); // C++方式
    • int hamburgers = {24}; //C++11初始化方式,用于數組或結構,也可用于單值變量
  10. C++11初始化方式

    • int a{2};//a=2
    • int b = {3};//b=3
    • int c{};//c=0
    • int d = {};//d=0

C++11使得可將大括號初始化器用于任何類型(可以使用等號,也可以不使用),這是一種通用的初始化語法。

3.1.4 無符號類型

  1. 優點:增大變量能夠存儲的最大值
  2. 使用:使用關鍵字unsigned(unsigned int的縮寫)
  3. 典型的整型溢出行為


    典型的整型溢出行為

3.1.5 選擇整型類型

  1. int被設置為目標計算機的自然長度(natural size,指的是計算機處理起來效率最高的長度)
  2. 如果沒有非常有說服力的理由,則選擇int
  3. 如果變量表示的值不可能為負,則使用無符號類型
  4. 如果知道可能表示的整數值大于16位證書的額最大可能值,則使用long
  5. 如果存儲的值操作20億,則使用long long
  6. 當有大型整型數組或節省內存很重要時才使用short

3.1.6 整型字面值

  1. 十進制:第一位是1~9
  2. 八進制:第一位是0
  3. 十六進制:前兩位是0x或0X
  4. 雖然有不同的表示方式,但是都將以相同的方式(二進制數) 存儲在計算機中
  5. 控制符oct或hex,實際上是一條消息,告訴cout采取何種行為
int a = 10;
//輸出八進制
cout <<oct
 <<a;
//輸出十六進制
cout <<hex
 <<a;

3.1.7 C++如何確定常量的類型

  1. 除非有理由(使用特殊后綴或者值太大)存儲為其他類型,否則默認將整型常量存為int
  2. 首先看后綴
    • long:l/L后綴
    • unsigned int:u/U 后綴
    • unsigned long:ul/uL/Ul/UL后綴
    • long long 和 unsigned long long 同理
  3. 其次看長度
    • 對于不帶后綴的十進制整數的考慮順序:int 、long、long long
    • 對于不帶后綴的十六進制或八進制整數的考慮順序:int、unsigned int、unsigned long、long long、unsigned long long

3.1.8 char類型:字符和小整數

  1. 存儲字母:通過字母的數值編碼解決問題
  2. char用來處理字符,也可以用做比short更小的整型
  3. cin和cout的轉化作用:根據變量類型,輸入和輸出字符類型
  4. C++對字符使用單引號,對字符串使用雙引號
  5. cout.put(字符常量/字符變量) 函數
    • 作用:顯示一個字符
    • 是ostream的一個成員函數,句號是成員運算符
    • 歷史緣故:cout在C++Release 2.0之前,cout將字符變量顯示為字符,而將字符常量顯示為數字
  6. char字面值
    • 常規字符:使用單引號括起
    • 非常規字符(比如單引號):使用轉義字符(\)轉義,可以使用數字轉義序列或字符轉義序列(比如 \0x8和\b都表示退格)
  7. 通用字符名
    • C++支持一個基本的源字符集,即可用來編寫源代碼的字符集
    • C++標準還允許實現提供擴展源字符集和擴展執行字符集
    • C++提供一種表示特殊字符的機制,獨立于任何特定的鍵盤,使用通用字符名(universal character name)
    • \u + 8個十六進制位
    • \U + 16個十六進制位
  8. signed char和unsigned char
    • char在默認情況下既不是有符號也不是沒有符號的,是否有符號由C++實現決定
    • signed char范圍-128~127,unsigned char范圍0~255
  9. wchar_t
    • 解決的問題:程序需要處理的字符集無法使用一個8位的字節表示
    • 解決方法1:如果大型字符集是實現的基本字符集,那么編譯器廠商可以將char定義為一個16位字節或者更長的字節
    • 解決方法2:使用wchar_t (寬字符類型),底層的類型取決于C++實現,可能是unsigned short或int等
    • wcin和wcout可以處理wchar_t流
    • 加上前綴L來指示寬字符常量和寬字符串(如,L"tall")
  10. C++ 11新增類型:char16_t 和 char32_t
    • 解決的問題:Unicode的普及,對特定長度和符號特征的類型的需要,而wchar_t隨實現而不同
    • 使用前綴u指示char16_t,無符號,長16位
    • 使用前綴U指示char32_t,有符號,長32位

3.1.9 bool類型

  1. C++將非零值解釋為true,將零解釋為false
  2. 任何數字值或指針值都就可以被隱式轉換為bool值

3.2 const限定符

符號常量的表示:

  • 名稱首字母大寫
  • 整個名稱大寫
  • 使用前綴k
  • ......

如果聲明常量時沒有提供值,則該常量的值將是不確定的,且無法修改的。

const較#define的優點:

  • 能夠明確指定類型
  • 可以用使用C++的作用域規則將定義限定在特定的函數或文件中
  • 可以將const用于復合類型

ANSI C和C++中const的區別:

  • 作用域規則
  • C++中可以用const值聲明數組長度

3.3 浮點數

小數,帶小數部分的數字,分兩部分存儲,一部分表示值,另一部分表示縮放因子(用來移動小數點的位置)。

3.3.1 書寫浮點數

  1. 標準小數點表示法
  2. E表示法
    • d.dddE+n表示將小數點向右移動n位
    • d.dddE-n表示將小數點向坐移動n位
E表示法

3.3.2 浮點類型

  1. C++有3中浮點類型:float、double、long double
  2. 表示:有效數位+允許的指數最小范圍
  3. 有效位(significant figure):數字中有意義的位
  4. 可以查看頭文件cfloat獲取系統對浮點數的限制

3.3.3 浮點常量

  1. 默認情況下為double類型
  2. 如果希望常量為float類型,請使用f或F后綴
  3. 如果希望為long double,可使用l或L后綴

3.3.4 浮點數的優缺點

  1. 可以表示整數之間的值
  2. 由于有縮放因子,可以表示更大范圍的的數
  3. 浮點運算速度慢,精度低

3.4 C++算術運算符

3.4.1 運算符優先級和結核性

  1. 僅當兩個運算符被用于同一操作數時,優先級和結合性規則才有效
  2. C++使用優先級規則來確定首先使用哪個運算符
  3. 可以使用括號來執行自己定義的優先級
  4. 當兩個運算符優先級相同時,C++看操作數的結合性是從左到右還是從右到左

3.4.2 除法分支

除法運算符(\)的行為取決于操作數的類型

除法運算符的行為取決于操作數的類型

3.4.3 求模運算符

求模運算符(%):返回整數除法的余數

3.4.4 類型轉換

自動類型轉換的情況:

  • 將一種算術類型的值賦給另一種類型的變量
  • 表達式中包含不同的類型
  • 將參數傳遞給函數時

#1:初始化和賦值進行的轉換

轉換 潛在的問題
將較大的浮點類型轉換為較小的浮點類型,比如double轉float 精度降低;當值超出范圍時,結果不確定
將浮點型轉為整型 小數部分丟失;當值超出范圍時,結果不確定
將較大的整型轉為較小的整型,如long轉short 當值超出范圍時,通常只復制右邊的字節

#2:以{}方式初始化(列表初始化)時進行的轉換(C++11)

列表初始化不允許縮窄

#3:表達式中的轉換

自動轉換 不同類型運算時轉換
- bool、(unsigned)char、short 自動轉為 int,因為int類型是計算機的自然類型<br />- 若short比int短,則unsigned short被轉為int;若長度相同,則unsigned short被轉為unsigned int<br />- wchar_t被轉換成下列第一個寬度足夠存儲其取值范圍的類型:int、unsigned int、long和unsigned long 1. 按下列順序,當有一個類型符合,則另一個操作數將被轉換成同一類型:long double>double>float <br />2. 整型提升<br />3. 比較有無符號和操作數的級別

#4:傳遞參數時的轉換

  1. C++對char和short類型應用整型提升
  2. 將參數傳遞給取消原型對參數傳遞控制的函數時,C++將float參數提升為double

#5:強制類型轉換

  1. 強制類型轉換不會改變變量本身,而是創建一個新的、指定類型的值
  2. 強制類型轉換格式
    • (typename) vlaue //C Style
    • typename (vlaue) //C++ Style,就像函數調用一般
  3. static case<typename> value //更嚴格的類型轉換

3.4.5 C++11中的auto聲明

  • 讓編譯器根據初始值的類型推斷變量的類型
  • 一般用于處理復雜類型,比如STL中的類型
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容