C Primer Plus 讀書筆記 第3章

2022-05-28 07:45:12 字數 4816 閱讀 3581

第三章 處理資料

今天完成了該章的閱讀, 

本章對c++

涉及的資料型別做了乙個詳盡的說明

, 並且對於

c++與

c的細微區別做了說明

, 總的來所就是

c++相容

c的習慣

, 但是作者告訴我們為什麼

c++要做出這些改變

, 細細想想

, 的卻是有道理

.該章中牽涉到了部分c++11

特性, 

所以要確保編譯器支援這些特性

, 本人使用

dev 5.2.0.3. 

在工具->

編譯選項

->

編譯器 標籤下選擇編譯時加入以下命令

, 並在框中輸入 

-std=c++0x 即可.

最簡單的使用計算機處理資料的思維過程

1.資訊將存在**

;2.要儲存說明值

;3.儲存何種型別的資訊

.大概的想法就是根據需求來安排合理的儲存型別吧. 

當然在這之前就是要了解各個型別的特性

.關於變數的命名

經典的那幾條就不提了, 

書中還新增了一條

:一兩個下劃線或下劃線和大寫字母打頭的名稱被保留給實現(

編譯器及其使用的資源)使用

.以乙個下劃線開頭的名稱被保留給實現

, 用作全域性標示符

.對型別所佔位元組數的規定

short 至少16位

;int 至少與 

short 

一樣長;

long 至少為32位

, 且至少與 

int 

一樣長;

long long 至少64位

, 且至少與 

long 

一樣長.

float 至少為32位

;double 至少為48位

, 且至少與 

float 

一樣長;

long double 至少與 

double 

一樣長.

一種新的初始化

int var(5);  // 新的初始化方式

, 等價於 

int var = 5;  

之所以提供這種方式

, 因為這樣和初始化自己的類的形式非常相似

.對乙個變數的初始化要及時.

short year;

year = 1492;

並不提倡這樣的初始化, 

因為在實際編碼的過程中

, 萬一這兩條語句是分開的話

, 那麼中間的時刻

, 變數的值就一直是未定義的

. 這大大加大了程式的風險

.c++11推薦使用花括號初始化器來初始化乙個變數

(又稱列表初始化

)short year  // 可以省略掉括號

short year {} // 省略的話

, 將會初始化為

0還有乙個作用就是防範型別轉換錯誤, 

具體地說

, 列表初始化不允許窄縮

(narrowing), 

即變數的型別可能無法表示賦給它的值

. 例如

, 不允許將浮點型轉化為整型

, 在不同的整數之間轉換或將整型轉化為浮點型可能被允許

, 條件是編譯器知道目標變數能夠正確的儲存賦給它的值

. 例如

, 可將

int型賦值給

long, 

因為long

至少和int

一樣長; 

相反方向的轉換也可能被允許

, 只要

int變數能夠儲存賦給它的值

.選擇整形型別

如果知道變數的值可能會大於16

位整數, 

那麼建議使用

long, 

因為long

規定了至少為32位

, 而int可能在另外一台機器上只有16位

.如果確定數值不超過short

範圍, 

且是大型整型陣列時

, 建議使用

short, 

因為大部分的機器上

int都是32位

. 否則占用記憶體就將加倍

. 記憶體是能省則省

.整型字面值

以1-9

開頭的數字為十進位制數;以0

開頭的數字為八進位制數

;以0x

或者是0x

開頭的數字為十六進製制數

;源字符集與執行字符集

源字符集:

即可用來編寫源**的字符集

.執行字符集:

即程式執行期間可處理的字元

(如可從檔案中讀取或顯示到螢幕上的字元

)還增加了一些字元

, 如退格和振鈴

.c++允許對這兩者進行擴充

. 以後說不定可以 

int 

中國 = 0;

const和

define

的比較

define是

c語言中常用的定義常量的方式

. c++

推薦使用

const

有下面三條原因

:1.它能夠明確指定型別;

2.可以使用c++

作用域規則將定義限制在特定的函式或檔案中

;3.可以講const

用於更複雜的型別

.c++能夠使用

const

變數來初始化陣列長度, 而

c語言是不允許的

.浮點數的一句話概括

浮點數就是一部分表示值, 

一部分用於對值進行放大或縮小

.d.ddde+n 指的是將小數點向右移n位

, 而d.ddde-n 

是將小數點往左移n位

. 之所以稱之為」浮點」就是因為小數點可以移動.

浮點數的精度之痛

由於浮點數的精度是有限的因為乙個很大的浮點數加上乙個比較小的數的話, 

那麼這個浮點數看不到任何改變

. 例如

1e22 + 1, 

這個數用

float

來表示和 

1e22

意義相同

, 因為精度只有6位

. 浮點數的運算速度較慢

, 而且計算總是伴隨著精度問題

. 幸好的是平時的應用中對精度的要求並不高

.優先順序及結合性

該本書的這一說明終於給我說明白了, 

以前譚老的那本書說的總覺得不好理解

.從左到右的結合性意味著如果兩個優先順序相同的運算子作用於同乙個運算元, 

則首先應用左側的運算子

. 直接舉幾個例子.

int flyingpigs = 3 + 4 * 5;

4到底和

3做運算還是和

5做運算

, 由於

* 優先順序高於 

+, 所以先作後面的運算

int logs = 120 / 4 * 5;

這個又稍微有點區別, 4

到底是和

120做運算還是和

5做運算

. 由於 

/ 和 

* 的優先順序相同

,所以這個時候就要結合性

, 查表可知結合性為從左至右

, 因此4先和

120結合

. 所以最後的結果是

150.

注意, 

僅當兩個運算子被作用於同一運算元時

, 優先順序和結合性規則才有效

.int dues = 20 * 5 + 24 * 6;

由優先順序能夠知道20 * 5 

和 24 * 6

一定是優先做的

. 但是優先順序和結合性都沒有說明是先計算左邊的乘號還是先計算右邊的乘號

, c++

把這個問題留給了實現

. 依賴於不同的編譯平台

.c++11 中的

auto

宣告

這個東西有有優點也有缺點, 

問題就在於用在什麼地方

.首先它的作用是用來在不顯式的知名資料型別的情況下

, 編譯器能夠根據初始化的值來自動決定這個變數的型別

.auto n = 100;  // n is int

auto x = 1.5; // n is double

auto y = 1.3e12l  // y is long double

如果僅僅是這樣使用的話, 

很可能造成我們不願意看到的錯誤

:double y = 0;  // y is double, no problem, 0 automatically converted to 0.0

auto y = 0; // y is int, but you want to get a double y, just init by 0

後面的y

並沒有如願以償得到

double型.

乙個有用的使用方法是在使用迭代器的時候, 

我們知道申請乙個迭代器變數時需要長長的一串**

, 所以這個就非常好用了

.vectorscores;

auto it = scores.begin();

這樣就能夠輕鬆的得到乙個迭代器了.

c primer plus 讀書筆記1

c是一種融合了控制特性的語言,是一種快速 高效 緊湊 可移植性的語言。使用c語言的7個步驟 定義程式目標 設計程式 編寫 編譯程式 執行程式 測試和除錯程式 維護和修改程式。c程式是由乙個或多個函式組成,乙個c程式必須包含乙個main 函式 函式前面必須有乙個資料型別不能使用void 每個c語句都是...

C primer plus 讀書筆記 1

1.c的可移植性很高,在乙個系統上編寫的c程式稍作修改或不經修改就可以在其他系統上執行。2.程式設計的步驟 1 定義程式的目標 2 設計程式 程式如何完成目標,使用者介面如何,程式怎樣組織和執行,如何表達和處理資料,考慮魯棒性 例如使用者輸入失誤怎樣處理 邊界的處理.3 編寫 可以在文件txt編寫,...

C primer plus 讀書筆記(3)

1.系統預設將非整數儲存為double型,所以在計算時會出現將double型轉為float型的警告。2.f float型和double型 d int型 o 八進位制整數型 o 加上 號會有字首0 x 十六進製制整數型 x 加上 號會有字首0x u unsigned int ld long int l...