《C 自學入門》1 預備知識

2022-09-12 21:06:15 字數 3929 閱讀 3135

c++是在c語言基礎之上開發的一種語言,是c語言的超集,『++』取至c語言中的自加運算子,其意義不言而喻。學習c++是一次探索之旅,c++是一種令人興奮的語言,在二十世紀九十年代便是最重要的程式語言之一,並在二十一世紀仍然保持強勁的勢頭。c++既繼承了c語言高效,簡介,快速和可移植性的傳統,又為應對複雜程度不斷提高的現代程式設計任務而設計出了物件導向程式設計和模板特性所支援的泛型程式設計。

在過去的幾十年,計算機技術以令人驚訝的速度發展著,當前膝上型電腦的計算速度和儲存資訊的能力超過了二十世紀六十年代的大型機。計算機語言也得到了發展,儘管變化可能不是天翻地覆的,但也是非常重要的。體積更小,功能更強的計算機也引出了更大,更複雜的程式,而這些程式在程式管理和維護方面帶來了新的問題。

二十世紀七十年代早期,貝爾實驗室的ritchie致力於開發unix作業系統,為完成這項工作,ritchie需要一種能簡潔,快速,有效控制硬體的語言。傳統上,當時的程式設計師使用組合語言來滿足這些需求,組合語言依賴於內部機器語言。但是這是一種直接操作cpu暫存器和記憶體單元的低階語言,因為組合語言針對於特定的計算機處理器,要將匯程式設計序移植到另一台計算機上,必須重新編寫程式。這就像寧買了新車,它和舊車控制部位的位置不同,寧就需要重新學習熟練。

但是unix目的是為不同的計算機平台工作而設計,這就需要一種高階語言,高階語言致力於解決對應的問題,而不是直接操作硬體。(這就像寧知道手動車起步只需要踩離合,掛一檔一樣,而不需要知道離合具體是怎麼實現的)。我們需要知道,一種被稱為編譯器的特殊程式能將高階語言翻譯成特定的計算機內部語言,這樣各個平台就可以通過使用不同的編譯器在各自平台上使用同乙個高階語言程式了。於是ritchie這位牛逼的大佬又開發出了c語言。

一般來說,程式分為資料結構和演算法兩個部分。資料是程式使用和處理的資訊,而演算法是程式使用的方法,說明書。c語言在最初面世時也是過程性語言,計算機處理問題按照步驟一步一步來解決。就像菜譜指定了寧做蛋糕時應遵循的一系列步驟一樣。

隨著程式發展和規模的擴大,早期語言都會遇到組織方面的問題,例如,程式經常使用分支語句來判斷執行什麼命令。很多舊式程式執行路徑很混亂,幾乎不可能通過直接閱讀程式來理解它,更別提修改程式。因此一種更有序的程式設計方法--結構化程式設計出現了,c語言具有使用這種方法的特性。還有一種新原則是自上而下的設計,在c語言中,其理念時將大型程式分解成小型,便於管理的任務。如果任務仍然過大,直到將程式分解成小型的,易於編寫的模組。(比如寧要整理房間,先整理客廳,再打掃臥室,最後清潔廁所。寧就會先從客廳開始,客廳又分為飯桌,茶几,沙發,最後確定先清理飯桌,再是茶几。。。)

雖然結構化程式設計的理念提高了程式的清晰度,可靠性,並使之便於維護,但它在編寫大型程式時,仍面臨挑戰。為應對這種挑戰,oop提供了一種新思想,與強調演算法的過程性程式設計不同的是,oop強調的是資料,oop不是使問題滿足語言的過程性方法,而是試圖讓語言來滿足問題的要求。(寧要炒乙個番茄炒蛋,強調過程的c語言表現起來就像這樣:先洗菜切菜,再打蛋,再**放油,炒蛋。。。。但是物件導向思路體現起來更像是這種方式:先安排乙個人這個類物件,再取出菜類中的番茄物件和蛋類物件,最後賦予人這個物件執行炒菜的具體方法。)

c++中,類更像是一種規範,它描述了這種新型的資料格式,而物件是根據這種規劃所例項化的特定資料結構。類規定了可使哪些資料來表示物件以及可對資料執行哪些操作,這就是乙個類包含的屬性和方法兩個部分。

例如,假設寧要開發乙個五子棋對戰遊戲,那麼五子棋就可以用類來實現,這個類的屬性包含顏色,大小,座標位置等資料,它的方法可以包含移動,改變大小,改變顏色等操作。這樣當需要使用五子棋這個類時,就可以定義建立乙個具體物件,該物件儲存了描述五子棋的所有資料值。模擬到現實生活中,人就是乙個類,我們抽象乙個人通常用身材,顏值,性格等進行描述,再配上一系列人所具有的行為動作,比如走路,吃飯,學習等。。。這樣我們就可以抽象出乙個人類,但是我們想要讓人類具體實現什麼命令時,我們就需要例項化乙個某個人類物件來執行。

oop程式設計方法首先設計類,然後設計乙個特定的使用這些類物件的程式,這種從低階組織到高階組織的處理過程叫做自下而上程式設計。

oop程式設計並個僅僅是將資料和力法合併為類定義。例如,封裝-->oop還有助於建立可重用的**,這將減少大量的工作。資訊陷藏,許可權訪問符可以保護資料,使其免遭不適當的訪問。多型-->能夠為運算子和函式建立多個定義,通過程式設計的上下文來確定使用哪個定義。繼承-->能夠使用舊類派生出新類。對於程式的錯誤,利用異常可以方便的管理。通過模板,可以實現同名函式對於不同資料型別有各自的處理方式。通過名字空間和作用域訪問符,可以有效管理函式名,變數名,類名。等。。。。總之,c++的魅力遠不及這些,「此中有真意,欲辨已忘言」。

乙個c和c++程式要生成可執行檔案,要把源**通過編譯器編譯成中間檔案,一般windows下是.obj檔案,linux下是.o檔案。而gcc編譯c和c++程式執行都會經歷四個階段,預處理,編譯,彙編和鏈結。(gcc是gun針對c/c++程式推出的編譯器)預處理將帶#號開頭的命令進行替換,展開或是插入對應的標頭檔案,假如在linux寫了乙個源**main.c,

預處理-->

的命令就是:

gcc -e main.c -o main.i  

#gcc -e是執行生成.i檔案的命令,main.c是原始檔,-o 後面跟著的是目的檔案的名稱

#換個角度理解,mian.i是經過預處理的檔案,要得到main.i檔案必須需要main.c這個原始檔

得到.i檔案後就可以進行

第二個階段即是編譯、優化階段,經過預處理得到的輸出檔案中,只有常量,如數字、字串、變數的定義,以及c語言的關鍵字,

編譯程式所要作得工作就是通過詞法分析和語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間**表示或彙編**,用.s表示彙編**。

編譯-->的命令是:

gcc -s main.i -o main.s

#同樣的道理,我們要得到目的.s檔案就需要.i原始檔

接下來就是彙編,彙編就是把彙編**檔案生成機器**,對於被翻譯系統處理的每乙個c語言源程式,都將最終經過這一處理而得到相應的目標檔案。目標檔案中所存放的也就是與源程式等效的目標的機器語言**。目標檔案由段組成,一般這個**是二進位制格式,如果我們用vim編輯器去檢視會發現完全認不出來,當然了寧認不出不要緊,計算機能看懂就行了。彙編-->的命令是:

gcc -c main.s -o main.o

#.o檔案就是目標檔案

由匯程式設計序生成的目標檔案並不能馬上執行,其中可能還有許多沒有解決的問題。

例如,某個原始檔可能引用了另乙個原始檔中定義的某個變數或者函式呼叫等,在程式中可能呼叫了某個庫檔案中的函式,等等。所有的這些問題,都需要經鏈結程式的處理方能得以解決。鏈結的主要工作就是上步生成的.obj檔案和系統庫的.obj檔案、庫檔案鏈結起來,最終生成了可以在平台執行的可執行檔案。鏈結-->對應的命令是:

gcc main.o -o main 

#main就是可執行檔案了,在linux下不指定名稱預設為a.out

#需要執行的話需要在終端輸入./+可執行檔名稱

上述操作看起來應該十分繁瑣,但是乙個標準的c語言可執行程式就是這樣產生的,值得慶幸的是上面四行**可以簡化成一行:

gcc main.c -o main

#寧甚至可以再次簡化:gcc main.c就可以了,

#因為預設預設引數是a.out

Linq 預備知識(1)

一 區域性變數 var public class userinfo public string password class program i.tostring user.password string.format user i.tostring users.add user foreach v...

Linq 預備知識(1)

一 區域性變數 var public class userinfo public string password class program i.tostring user.password string.format user i.tostring users.add user foreach v...

C 預備知識

一 學前基礎 學習c 最好有一定的c語言基礎,當然也可以直接學習c 但是難度肯定不一樣。建議先粗略了解c語言的語法結構等基礎概念知識,在進行系統化的學習c 二 c和c 的區別 c 在c的基礎上新增了對物件導向程式設計和泛型程式設計的支援,所以c 是c語言的超集,是c語言的擴充版本,意味著任何有效的c...