C Primer Plus的若干收穫 (三)

2021-06-22 19:32:01 字數 3489 閱讀 8072

有時候懷疑真是懷疑自己走的路到底是不是正確的。作為乙個土生土長數學系學生,卻對數學毫無興趣,沒事的時候就喜歡躲在圖書館看看有關計算機的書。有時候期末考試時候會掛個一兩門的數學專業課,有時候真希望數學課本上這乙個個繁瑣的證明是用**寫的。自己幾乎丟掉了本專業的一切,去全身心投入到計算機這一龐大而繁瑣的學問中去。真心不知道2年之後自己畢業,自己的結果究竟是什麼樣的。自己現在唯一能做而又不讓自己後悔的我想就是盡可能的多學兩門語言與多看幾本計算機上的名著了。有時候真的不確定自己會堅持到什麼地步,是一直的走下去,還是。。。哎,先不糾結了,默默的堅持下去吧,堅持自己喜歡的東西。如果自己一直在數學的道路走下去的話,可能會生不如死。。。

3.1 陣列的替代品  模板類array

vector類的功能比陣列強大,但是付出的代價是效率稍低。如果您需要長度固定的陣列,使用陣列是最佳的選擇,但代價是不那麼方便和安全。有鑑於此,c++新增了模板類array。與陣列一樣array物件的長度也是固定的,也使用棧,而不是自由儲存區,因此效率與陣列相同

#include...

using namespace std;

arrayai;

arrayad=;

//推而廣之

arrayarray;

3.2 比較陣列、vector物件和array物件

下面來看乙個簡單的示例

#include#include#includeint main()

; vectora2(4);

a[0]=1/3;

a[1]=2/3;

a[3]=3/4'

a[4]=4/5;

arraya3=;

arraya4;

a4=a3;//可以直接複製,區別於陣列

cout<<"a1[2]:"《首先,注意到無論是陣列還是vector物件和array物件,都可以使用標準陣列表示法來訪問各個元素。其次從位址可知,array物件和陣列儲存在相同的記憶體區域(棧)中,而vector則儲存在另乙個區域中,自由儲存區或堆中。第三,注意到可以將array物件賦給另乙個array物件;而對於陣列,必須逐個複製元素。

3.3 ***和順序點

首先***指的是計算表示式時對某些東西進行了修改;順序點是程式執行的乙個點,在這裡,進去下一步之前將確保對所有的***進行評估。在c++中,語句中的分號就是乙個順序點,這意味著程式在處理下乙個語句之前,賦值運算子、遞增運算子和遞減運算子執行的所有修改都必須完成。另外任何完整的表示式末尾都是乙個順序點。什麼是乙個完整的表示式呢?他是這樣的:不是另乙個更大表示式的子表示式。下面來通過兩個例子來加深一下理解

while(guests++<10)

cout<

3.4 遞增/遞減和指標

當我們同時將*與++同時用於指標時將有這樣的疑問:將什麼解引用,將什麼遞增。這取決與優先順序和運算子的位置。字首遞增、字首遞減和解除引用運算子的優先順序相同。字尾遞增與字尾遞減的優先順序相同,但比字首運算子的優先順序高,這兩個運算子從左到右的方式進行結合。

3.5 復合語句(語句塊)

語句塊就是用一對花括號括起來的一條復合語句,他被視作一條語句,從而滿足句法的要求。比如for迴圈:

for(int i=1;i<=5;i++)

復合語句還有一條有趣的性質。如果在語句塊中定義乙個新的變數,則僅當程式執行該語句塊時,該變數才存在。執行完語句塊後該變數將被釋放。如果在乙個語句塊中宣告乙個變數,而在外部語句中也有乙個這樣的變數,情況將如何呢?在宣告位置到內部語句結束的範圍內,新變數將隱藏舊變數;然後舊變數再次可見,如下例所示:

#includeint main()

{ using namespace std;

int x=20;

{ cout<

3.6 c-風格字串與string類字串的比較

首先討論下c-風格字串。由於c++將c-風格字串視為位址,因此如果以關係運算子來比較它們將無法得到滿意的結果。相反,應使用c-風格字串庫中的strcmp()函式。該函式接受兩個字串位址作為引數,這意味著引數可以是指標、字串或是陣列名。

下面著重介紹一下string類字串的比較。它的比較比較簡單,因為類設計能夠讓您使用關係運算子進行比較。這之所以可行是因為類函式過載了這些運算子。來看如下例子:

#include#includeint main()

{ using namespace std;

string word="?ate";

for(char ch='a';word!="mate";ch++)

{ cout<

3.7 等待一段時間 :完成延時的迴圈

有時候延時一段時間很有用。比如,讀者可能遇到這樣的程式,它在螢幕上顯示一條訊息,而還沒來得及閱讀,又出現了其他的內容。c++庫中有乙個函式有助於完成這樣的操作。這個函式名為clock,返回程式開始執行後所用的系統時間。這有兩個複雜的問題:clock()返回的不一定是秒;其次該函式的返回型別可能不確定。

為解決這樣的問題,在標頭檔案ctime提供了這樣的解決方案。首先它定義了乙個符號常量--clock per sec,該常量等於每秒鐘包含系統時間的單位數。因此將系統時間除以這個數可以得到秒數。或者將這個數乘上clock per sec,可以得到以系統時間為單位的單位時間。其次,ctime將clock_t作為clock()返回型別的別名。如下程式演示了如何使用clock()函式和ctime標頭檔案來建立延時迴圈:

#include #include using namespace std;

int main()

{ cout<<"enter the delay time,in seconds:";

float seconds;

cin>>seconds;

clock_t delay=seconds*clocks_per_sec;

cout<<"starting\a\n";

clock_t start=clock();

while(clock()-start

3.8 型別別名

下面簡要介紹一下型別別名。c++為型別建立別名有兩種方式。

一種是使用預處理器:

#define byte char

這樣,預處理器將在編譯程式編譯程式是用char來替換byte,從而使byte成為char的別名。

第二種方法使用關鍵字typedef來建立別名,完成上述的**可以

typedef char byte;

typedef typename alianame//通用格式

一般情況下最好使用typedef來宣告一系列的變數,而在使用#define時可能會遇到一些問題。注意,typedef不會建立新型別,而只是為已有的型別建立乙個別名,在有些情況下,在定義一些變數時會更簡便。

C Primer Plus的若干收穫 (二)

哎,真是不想吐槽考駕照的艱辛歷程了。跑到大西郊,頂著大太陽,一天就能摸上個十幾分鐘二十分鐘的車,簡直不要太坑爹,這兩天真是做的我屁股疼的不行。今天果斷不去了。只可惜我的大阿根廷啊,堅持到最後功虧一簣惜敗於德國,枉我四點自然醒起來看了接下來的比賽。不能不佩服諾伊爾,拉姆,博阿滕組成的後防線,讓阿根廷整...

C Primer Plus的若干收穫 (四)

經過半個月的辛苦的學習,終於把那個該死的科目三給考過去了,真是太煎熬啊。又被曬黑了,不知道又要捂多久才能重新變過來。不過,好在自己抽空能夠看下c 時間也不算太難過。馬上要回學校了,一看自己才寫了三篇博文,簡直不能忍了。最近要加把油啊,一會學校事情可就多了。1.1 檔案尾條件 如果輸入來自於檔案,則存...

C Primer Plus的若干收穫 (七

這篇博文主要講了命名空間,說實話在接觸之前一直對這方面很感興趣,現在來好好的學習一番。7.1 新的命名空間特性 c 新增了這樣一種功能,即通過定義一種新的宣告區域來建立命名的命名空間,這樣做的目的之一是提供乙個宣告名稱的區域。乙個命名空間的名稱不會與另外乙個空間的名稱發生衝突,同時允許程式的其他部分...