「C++」C++ Primer Plus 笔记:第三章 处理数据
面向?qū)ο缶幊痰谋举|(zhì)是設(shè)計(jì)并擴(kuò)展自己的數(shù)據(jù)類型。
C++內(nèi)置的數(shù)據(jù)類型分為兩組:基本類型和復(fù)合類型。基本類型包括整數(shù)和浮點(diǎn)數(shù);復(fù)合類型是在基本類型的基礎(chǔ)上構(gòu)建的數(shù)組,字符串,指針和結(jié)構(gòu)。
3.1 簡單變量
3.1.1 變量名
- 命名規(guī)則
- 名稱中只能使用字母,數(shù)字,下劃線
- 名稱第一個(gè)字符不能為數(shù)字
- 不能使用C++關(guān)鍵字作為名稱
- 兩個(gè)下劃線開頭/下劃線+大寫字母開頭的也不可以,這樣的名稱是留作系統(tǒng)使用
3.1.2 整型
- C++ 的基本整型分別是:char,short,int,long和C11新增的long long;每種類型都有符號(hào)版本和無符號(hào)版本
3.1.3 整形short,int,long和long long
- short是short int的簡稱,而long是long int的簡稱
- sizeof
返回?cái)?shù)據(jù)類型占用內(nèi)存長度 - #include
定義了符號(hào)常量來表示類型限制 - #define
該指令的工作方式類似文本編輯器或字處理中的全局搜索并替換命令,它之查找獨(dú)立的標(biāo)記(單獨(dú)的單詞),跳過單詞內(nèi)部嵌入的搜索內(nèi)容;C++創(chuàng)建符號(hào)常量的方法一般使用const,不會(huì)經(jīng)常使用#define,但在C++中仍會(huì)用到#define - 可以使用表達(dá)式對(duì)變量賦值,前提是表達(dá)是已經(jīng)定義過的
- C++賦值方式:int wrens(432);
- C++11標(biāo)準(zhǔn)允許等號(hào)、大括號(hào)來初始化變量,例如:int emus = {7}; int rheas = {12}; int rocs = {}; // set rocs to 0 int psychics{}; //set psychice to 0 大括號(hào)初始化器是C++專有,使變量初始化方式趨于平凡
3.1.4 無符號(hào)類型
- 創(chuàng)建無符號(hào)數(shù)據(jù)類型,只需要使用關(guān)鍵字unsigned來修飾聲明即可:unsigned short change;
- 當(dāng)超出數(shù)值類型能夠表示的范圍時(shí),其實(shí)際表示的值需要根據(jù)計(jì)算機(jī)系統(tǒng)計(jì)算規(guī)則來計(jì)算
3.1.5 選擇整型類型
- 數(shù)據(jù)類型聲明沒有特殊需求,一般使用int;如果變量表示的整數(shù)大于16位整數(shù)值,建議使用long,方便在程序移植時(shí);無符號(hào)數(shù)可以表示現(xiàn)實(shí)生活中不會(huì)是負(fù)數(shù)的數(shù)據(jù)比如人口;short比int小,可以在需要節(jié)省內(nèi)存的時(shí)候使用;只需要一個(gè)字節(jié)的,可以使用char
3.1.6 整型字面值
-
C++能夠以三種不同的計(jì)數(shù)方式書寫整數(shù):基數(shù)為10、基數(shù)為8、基數(shù)為16;且使用前一(兩)位來標(biāo)識(shí)基數(shù)。如果第一位為1-9,則基數(shù)為10;如果第一位是0,第二位是1-7,則基數(shù)為8;如果前兩位為0x/0X,則基數(shù)為16。這些書寫方式僅僅是為了表達(dá)方便,最終都會(huì)以二進(jìn)制的方式存儲(chǔ)在計(jì)算機(jī)內(nèi)存中
-
默認(rèn)情況下,cout以十進(jìn)制格式顯示整數(shù);如果要以十六進(jìn)制/八進(jìn)制方式顯示,可以特別指明:C++使用控制符endl指示cout重起一行,除此之外還提供了dec,hex,oct分別用于指示cout以十進(jìn)制、十六進(jìn)制、八進(jìn)制格式顯示整數(shù),具體用法如下:
int a = 42; int b = 42; int c = 42;cout << "a = " << a << ", in decimal. "; cout << hex; cout << "b = " << b << ", in hexadecimal. "; cout << oct; cout << "c = " << c << ", in octal. ";最終得到的輸出如下:
"a = 42 in decimal. " "b = 2a in hexadecimal. " "c = 52 in octal. "這些控制符都處于std命名空間,只修改了cout的輸出方式
3.1.7 C++如何確定常量類型
- C++在面對(duì)未知數(shù)據(jù)類型時(shí),除非有理由存儲(chǔ)為其他類型,否則將存儲(chǔ)為int類型
3.1.8 char類型:字符和小整數(shù)
-
char類型是專門為存儲(chǔ)字符設(shè)計(jì)的,由于很多系統(tǒng)支持的字符數(shù)大多不超過128個(gè),可以由一個(gè)字節(jié)表示,因此雖然char用來表示字符,但也可以用來表示short更小的整型
-
C++對(duì)字符使用單引號(hào),對(duì)字符串使用雙引號(hào)
-
“\n”、'\n’在C++中表示換行符
-
ASCII碼在一個(gè)變量中存儲(chǔ)的是數(shù)字編號(hào),當(dāng)打印時(shí),cout將存儲(chǔ)的數(shù)字編號(hào)轉(zhuǎn)換成數(shù)字編號(hào)對(duì)應(yīng)的字符,cin和cout的這一行為,是由變量類型引導(dǎo)的
-
一定要注意C++中單引號(hào)和雙引號(hào)使用區(qū)別:單引號(hào)表示一個(gè)字符,雙引號(hào)表示一串字符
-
cout.put()函數(shù)顯示一個(gè)字符
-
在cout.put()函數(shù)中,cout表示對(duì)象,put()表示成員函數(shù),其中“.”被稱為成員運(yùn)算符
-
轉(zhuǎn)移序列:\
-
換行符\n可以替代endl
-
char默認(rèn)情況下既不是沒有符號(hào),也不是有符號(hào)類型,具體要根據(jù)C++的實(shí)現(xiàn)來決定,這樣開發(fā)人員可以最大限度地將這種類型與硬件屬性匹配起來;如果有必要,可以顯式地設(shè)置char類型:
char fodo; // 可能是signed,也可能是unsigned unsigned char bar; // unsigned signed nark; // signed -
wchar_t:寬字符類型。char表示基本字符類型,一般的表示范圍為-128到127(signed類型)或者0-255(unsigned)類型,但如果要表示超過這個(gè)范圍的字符類型,那么就可以使用wchar_t;cin和cout將輸入和輸出看做是char流,而對(duì)于wchar流,應(yīng)該使用wcin和wcout來進(jìn)行處理。此外C11新增了長16位的char16_t和長度為32位的char32_t兩種無符號(hào)數(shù)據(jù)類型
-
C++支持隱式轉(zhuǎn)換,所有非零值會(huì)被轉(zhuǎn)換為true,零值轉(zhuǎn)換為false
3.2 const限定符
- const:當(dāng)在變量申請(qǐng)時(shí)申明該變量為const,那么之后任何試圖修改該變量的操作都是不允許的;且應(yīng)該變量申請(qǐng)時(shí)就初始化,如果沒有在聲明中初始化,那么該值將是不確定的,且無法修改
3.3 浮點(diǎn)數(shù)
3.3.1 書寫浮點(diǎn)數(shù)
- 手寫方式或科學(xué)計(jì)數(shù)法方式(科學(xué)計(jì)數(shù)法中數(shù)字前面的符號(hào)用于表示正負(fù),e后面的正負(fù)表示指數(shù)縮放)
3.3.2 浮點(diǎn)類型
- ostream庫中的setf()函數(shù)迫使輸出使用定點(diǎn)表示法,防止程序把較大的值切換成科學(xué)表示法,并使程序顯示到小數(shù)點(diǎn)后6位
- 通常cout會(huì)刪除結(jié)尾處的0,而setf會(huì)覆蓋這一行為,正常顯示到小數(shù)點(diǎn)后6位;雖然只顯示6位,但當(dāng)float和double分別乘以一百萬后,顯示的結(jié)果會(huì)因?yàn)榫炔煌兴鶇^(qū)別
3.3.3 浮點(diǎn)常量
- 程序中書寫浮點(diǎn)常量默認(rèn)為double類型。如果希望是float類型,需要在數(shù)字后面加上f/F后綴;long double類型需要加上l/L后綴
3.3.4 浮點(diǎn)數(shù)的優(yōu)缺點(diǎn)
- 浮點(diǎn)數(shù)的運(yùn)算比整數(shù)慢
3.4 C++算術(shù)運(yùn)算符
-
-
-
- /:當(dāng)除數(shù)和被除數(shù)同時(shí)為整數(shù)時(shí),除法返回整數(shù)結(jié)果;當(dāng)其中一方為浮點(diǎn)數(shù)時(shí),除法結(jié)果為浮點(diǎn)數(shù)
- %:取余/模運(yùn)算
- 對(duì)于float,C++只保證6位有效位
3.4.1 運(yùn)算符優(yōu)先級(jí)和結(jié)合性
- C++遵從代數(shù)的計(jì)算優(yōu)先級(jí):先乘除、后加減;乘除是同一優(yōu)先級(jí),加減是同一優(yōu)先級(jí);但同一優(yōu)先級(jí)的運(yùn)算,運(yùn)算順序從左到右,比如120 / 4 * 5 = 150
3.4.2 除法分支
- 浮點(diǎn)常量默認(rèn)情況下是double類型
- 運(yùn)算符重載:使用相同的符號(hào)進(jìn)行多種操作;C++允許擴(kuò)展運(yùn)算符重載
3.4.3 求模運(yùn)算符
3.4.4 類型轉(zhuǎn)換
- C++有11種整形和3種浮點(diǎn)型
- C++發(fā)生類型轉(zhuǎn)換的場景:
- 將一種算術(shù)類型賦值給另一種算術(shù)類型
- 表達(dá)式中包含不同類型時(shí)
- 將參數(shù)傳遞給函數(shù)時(shí),會(huì)進(jìn)行類型轉(zhuǎn)換
3.4.4.1 初始化和賦值進(jìn)行轉(zhuǎn)換
當(dāng)較大的浮點(diǎn)數(shù)->較小浮點(diǎn)數(shù),浮點(diǎn)數(shù)->整型,較大的整型->較小的整型,都可能存在結(jié)果不確定。
3.4.4.2 以{}方式初始化時(shí)進(jìn)行的轉(zhuǎn)換(C11)
C11對(duì)類型轉(zhuǎn)換要求更嚴(yán)格:
3.4.4.3 表達(dá)式中的轉(zhuǎn)換
表達(dá)式中的轉(zhuǎn)換存在兩種情況:
在計(jì)算表達(dá)式時(shí),C++會(huì)自動(dòng)將bool,char,usigned char,signed char和short自動(dòng)轉(zhuǎn)換為int,這種轉(zhuǎn)換被成為整形提升,一個(gè)整形提升的例子是:short chickens = 20; short ducks = 35; short fowl = chickens + ducks; 當(dāng)計(jì)算fowl值時(shí),編譯器自動(dòng)將chickens和ducks轉(zhuǎn)換成int類型,計(jì)算出結(jié)果后,再將結(jié)果從int轉(zhuǎn)換成short。這么做的原因只是因?yàn)橛?jì)算機(jī)使用這種類型,計(jì)算會(huì)更快。
例如將int和float相加時(shí),當(dāng)運(yùn)算涉及兩種類型,小的類型會(huì)被轉(zhuǎn)換為較大的類型。
-
C11版本類型轉(zhuǎn)換校驗(yàn)表
- 如果有l(wèi)ong double,向long double看齊
- 如果有double,向double看齊
- 如果有float,向float看齊
- 如果以上都沒有,則執(zhí)行整形提升
- 如果兩個(gè)操作數(shù)都是有符號(hào)的/無符號(hào)的,級(jí)別低的向級(jí)別高的靠攏
- 如果一個(gè)有符號(hào),一個(gè)無符號(hào),且無符號(hào)操作數(shù)比有符號(hào)操作數(shù)級(jí)別高,仍然是級(jí)別低向級(jí)別搞看齊
- 如果有符號(hào)類型可以表示無符號(hào)所有可能取值,則將無符號(hào)轉(zhuǎn)換為有符號(hào)類型進(jìn)行操作
- 否則,將兩個(gè)操作數(shù)都轉(zhuǎn)換為有符號(hào)類型的無符號(hào)版本
-
傳統(tǒng)C總是將float提升為double
-
級(jí)別就是:long long > long > int > short > signed char; char = signed char = unsigned char, bool級(jí)別最低;wchar_t, char16_t, char32_t級(jí)別與底層類型相同
總結(jié)
以上是生活随笔為你收集整理的「C++」C++ Primer Plus 笔记:第三章 处理数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 惠普笔怎么u盘启动项 惠普笔记本如何设置
- 下一篇: s3c2440移植MQTT