C語言C++編程學(xué)習(xí):編譯機(jī)制和語言標(biāo)準(zhǔn)

C語言是面向過程的,而C++是面向?qū)ο蟮?/p>

C和C++的區(qū)別:

C是一個(gè)結(jié)構(gòu)化語言,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計(jì)首要考慮的是如何通過一個(gè)過程,對輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)单鹿。

C++,首要考慮的是如何構(gòu)造一個(gè)對象模型深纲,讓這個(gè)模型能夠契合與之對應(yīng)的問題域仲锄,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣囤萤。之所以說C++比C更先進(jìn)昼窗,是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”。

C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣涛舍。之所以說C++比C更先進(jìn)澄惊,是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”,而就語言本身而言,在C中更多的是算法的概念掸驱。那么是不是C就不重要了肛搬,錯(cuò)!算法是程序設(shè)計(jì)的基礎(chǔ)毕贼,好的設(shè)計(jì)如果沒有好的算法温赔,一樣不行。而且鬼癣,“C加上好的設(shè)計(jì)”也能寫出非常好的東西陶贼。

編程機(jī)制

編寫程序時(shí)必須遵循確切步驟主要是取決于你的計(jì)算機(jī)環(huán)境。因?yàn)?C語言是可以移植的待秃,所以它在許多環(huán)境中可用拜秧,其中包括 UNIX,Linux章郁,Windows等等 枉氮。

不過,讓我們首先來看一看許多環(huán)境所共有的一些方面暖庄。你完全不必知道運(yùn)行一個(gè) C 程序后面的事情聊替,但了解一點(diǎn)是一個(gè)很好的背景知識。它還可以幫助你理解為什么編寫一個(gè) C 程序必須經(jīng)過一些特定步驟培廓。

用 C 語言編寫一個(gè)程序時(shí)惹悄,你將編寫的內(nèi)容保存在一個(gè)被稱為源代碼文件的文本文件中。大多數(shù) 的系統(tǒng)医舆,都需要該文件的名稱以 .c 結(jié)尾俘侠。例如象缀,helloworld.c 蔬将。名稱中小點(diǎn)前的部分被稱為基本名,小點(diǎn)后的部分被稱為擴(kuò)展名央星。因此霞怀,helloworld是一個(gè)基本名,c 是一個(gè)擴(kuò)展名莉给。組合在一起的 helloworld.c是文件名毙石。

這樣,在我們提到名稱時(shí)內(nèi)容就可以更具體颓遏,我們假定有一個(gè)名為 helloworld.c的源文件徐矩,其源代碼如下面所示。

小編推薦一個(gè)學(xué)C語言/C++的學(xué)習(xí)裙【 六九九叁幢,四七零滤灯,五九六 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)鳞骤!裙內(nèi)有開發(fā)工具窒百,很多干貨和技術(shù)資料分享!

------------------------------------------------------

#include

int main ()

{

printf("hello world豫尽! ");

return 0;

}

------------------------------------------------------

目標(biāo)代碼文件篙梢、可執(zhí)行文件和庫

C語言編程的基本策略是使用程序?qū)⒃创a文件轉(zhuǎn)換為可執(zhí)行文件,此文件包含可以運(yùn)行機(jī)器語言代碼美旧。它分兩步完成這一工作:編譯和鏈接渤滞。編譯器將源代碼轉(zhuǎn)換為中間代碼,鏈接器將此中間代碼與其他代碼相結(jié)合生成可執(zhí)行文件榴嗅。C 使用被劃分為兩部分的這一方法使程序便于模塊化蔼水。你可分別編譯各個(gè)模塊,然后使用鏈接器將編譯過的模塊結(jié)合起來录肯。這樣趴腋,如果需要改變一個(gè)模塊,則不必重新編譯所有其他的模塊论咏。同時(shí)优炬,鏈接器將你的程序與預(yù)編譯的庫代碼結(jié)合起來。

中間文件的形式有多種選擇厅贪。最一般的選擇蠢护,同時(shí)也是我們這里講述的實(shí)現(xiàn)方式所采取的選擇,是將源代碼轉(zhuǎn)換為機(jī)器語言代碼养涮,將結(jié)果放置在一個(gè)目標(biāo)代碼文件中葵硕。雖然目標(biāo)文件包含機(jī)器語言代碼,但該文件還不能運(yùn)行贯吓。目標(biāo)文件包含源代碼的轉(zhuǎn)換結(jié)果懈凹,但它還不是一個(gè)完整的程序。

目標(biāo)代碼文件中所缺少的第一個(gè)元素是一種叫做啟動代碼(start-up code)的東西悄谐,此代碼相當(dāng)于你的程序和操作系統(tǒng)之間的接口介评。例如,你可以在DOS或Linux下運(yùn)行一個(gè) IBM PC兼容機(jī)爬舰,在兩種情況中硬件是相同的辽慕,所以會使用同樣的目標(biāo)代碼奔浅,但DOS與Linux要使用不同的啟動代碼迟几,因?yàn)檫@兩種系統(tǒng)處理程序的方式是不同的酿箭。

所缺少的第二個(gè)元素是庫例程的代碼。幾乎所有C程序都利用標(biāo)準(zhǔn)C庫中所包含的例程(稱為函數(shù))垃你。例如椅文,前面的 concrete.c 使用了函數(shù) printf()颈墅。目標(biāo)代碼文件不包含這一函數(shù)的代碼,它只包含聲明使用 printf()函數(shù)的指令雾袱。實(shí)際代碼存儲在另一個(gè)稱為“庫”的文件中恤筛。庫文件中包含許多函數(shù)的目標(biāo)代碼。

鏈接器的作用是將【目標(biāo)代碼】芹橡、【系統(tǒng)的標(biāo)準(zhǔn)啟動代碼】和【庫代碼】這3個(gè)元素結(jié)合在一起毒坛,并將它們存放在單個(gè)文件,即可執(zhí)行文件中林说。對庫代碼來說煎殷,鏈接器只從庫中提取你所使用的函數(shù)所需要的代碼,如下圖中的簡單示例:

簡而言之腿箩,目標(biāo)文件和可執(zhí)行文件都是由機(jī)器語言指令組成的豪直。但目標(biāo)文件只包含你所編寫的代碼轉(zhuǎn)換成的機(jī)器語言,而可執(zhí)行文件還包含你所使用的庫例程以及啟動代碼的機(jī)器代碼珠移。

Windows系統(tǒng)的集成開發(fā)環(huán)境

因?yàn)?C 編譯器不是標(biāo)準(zhǔn) Windows 包的一部分弓乙,所以需要獲得并安裝一個(gè) C 編譯器。許多廠商都會提供基于 Windows的集成開發(fā)環(huán)境(IDE) 钧惧。所有編譯器都具有用來裝配C程序的快速暇韧,集成的開發(fā)環(huán)境。關(guān)鍵的一點(diǎn)是浓瞪,它們都具有內(nèi)置的編輯器懈玻,可用來編寫C程序。這類開發(fā)環(huán)境一般都提供了讓你可以命名和保存源代碼文件的菜單乾颁,以及讓你可以不離開IDE就能編譯和運(yùn)行程序的菜單涂乌。如果編譯器發(fā)現(xiàn)任何錯(cuò)誤,會返回到編輯器中英岭,而且編輯器可以標(biāo)出有問題的行湾盒,并將它們與相應(yīng)的錯(cuò)誤消息匹配起來,例如VC6.0巴席、QT历涝、Visual Studio(簡稱vs)诅需。

Windows IDE最初可能讓人有一點(diǎn)望而生畏漾唉,因?yàn)樗鼈兲峁┒喾N目標(biāo),也就是說堰塌,提供了多種可讓程序在其中運(yùn)行的環(huán)境赵刑。例如,它們可能提供16位Windows程序场刑,32位Windows程序般此,動態(tài)鏈接庫文件(DLL)等等讓你選擇蚪战。許多目標(biāo)都需要引入Windows圖形界面的支持。為了管理這些選項(xiàng)铐懊,通常需要創(chuàng)建一個(gè)項(xiàng)目邀桑,以便隨后向其中添加將要使用的源代碼文件名。一般來說科乎,首先使用文件菜單來創(chuàng)建一個(gè)新的項(xiàng)目壁畸。重要的是選取正確的項(xiàng)目形式。本書中的例子是一般性的例子茅茂,設(shè)計(jì)目的是在一個(gè)簡單的命令行環(huán)境中運(yùn)行捏萍。

小編推薦一個(gè)學(xué)C語言/C++的學(xué)習(xí)裙【 六九九,四七零空闲,五九六 】令杈,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)碴倾!裙內(nèi)有開發(fā)工具逗噩,很多干貨和技術(shù)資料分享!

因?yàn)?Widnows IDE一般可處理 C 和 C++跌榔,所以你應(yīng)該指明你需要一個(gè)C程序给赞。在某些產(chǎn)品,可以使用項(xiàng)目類型來指明希望使用 C矫户。而在其他一些產(chǎn)品片迅,如 Microsoft Visual C++中,可以使用.c文件擴(kuò)展名來指明希望使用 C 而不是 C++皆辽。然而柑蛇,大多數(shù) C 程序也可以作為 C++程序運(yùn)行。

可能大家在寫完一個(gè)程序之后會遇到一個(gè)問題:顯示程序執(zhí)行的窗口在程序終止時(shí)突然消失驱闷,也就是程序運(yùn)行后窗口一閃而過耻台。如果遇到這種情況,那么可以使程序暫停空另,直到按下 Enter鍵盆耽。要做到這一點(diǎn),請?jiān)诔绦虻哪┪捕蟛ぃ『迷?return 語句之前摄杂,添加下面的一行:

getchar();

該行讀取一次按鍵循榆,因此程序?qū)和V钡桨聪?Enter 鍵時(shí)析恢。有時(shí),根據(jù)程序函數(shù)的需要秧饮,可能已經(jīng)有一個(gè)等待按鍵的指令映挂。在這種情況下泽篮,需要使用 getchar()兩次:

getchar();

getchar();

例如,如果程序最后做的事情是請你輸入你的體重柑船,那么就應(yīng)當(dāng)鍵入你的體重并按 Enter 鍵以輸入數(shù)據(jù)帽撑。程序?qū)⒆x取體重,第1個(gè)getchar()將讀取 Enter鍵鞍时,第2個(gè)getchar()將導(dǎo)致程序暫停油狂,直到再次按下 Enter鍵。如果現(xiàn)在你對此還不太理解寸癌,那么在學(xué)習(xí)更多關(guān)于 C 輸入的知識后你就明白了专筷。

雖然各種IDE都有許多共同的原則,但在細(xì)節(jié)方面會因產(chǎn)品而異蒸苇,而在一個(gè)產(chǎn)品系列中磷蛹,又會因版本而異。你必須要經(jīng)過一些實(shí)踐溪烤,才能知道編譯器的正確工作方式味咳。

語言標(biāo)準(zhǔn)

目前,有許多 C 實(shí)現(xiàn)方式可用檬嘀。理想情況下槽驶,編寫 C 程序時(shí),假如該程序末使用機(jī)器特定的編程技能鸳兽,則它在任何實(shí)現(xiàn)方式中的運(yùn)行應(yīng)該是相同的掂铐。要在實(shí)踐中做到這一點(diǎn),不同的實(shí)現(xiàn)方式需要遵守一個(gè)公認(rèn)的標(biāo)準(zhǔn)揍异。

首先說明一點(diǎn)全陨,C語言并沒有官方的標(biāo)準(zhǔn)。不過衷掷,Brian Kernighan 和 Dennis Ritchie 編寫的 The C Programming Language 第1版(1978)成為大家接受的標(biāo)準(zhǔn)辱姨,通常稱為 K&R C 或經(jīng)典 C。特別是這本書附錄中的“C Reference Manual”已成為 C 實(shí)現(xiàn)的指南戚嗅。例如雨涛,編譯器都會聲明它可提供一個(gè)完整的 K&R 實(shí)現(xiàn)。然而懦胞,雖然該附錄定義了 C 語言替久,但是卻沒有定義 C 庫。因?yàn)?C 比大多數(shù)其他語言更加依賴庫医瘫,所以還需要一個(gè)庫標(biāo)準(zhǔn)侣肄。因?yàn)槿狈θ魏喂俜綐?biāo)準(zhǔn),所以提供 UNIX 實(shí)現(xiàn)的庫成為一個(gè)事實(shí)上的標(biāo)準(zhǔn)醇份。

第1個(gè) ANSI/ISO C 標(biāo)準(zhǔn)

隨著 C語言的發(fā)展和更加廣泛地用于更多種類的系統(tǒng)上稼锅,使用 C 的群體意識到它需要一個(gè)更加全面,新穎和嚴(yán)格的標(biāo)準(zhǔn)僚纷。為了滿足這一要求矩距,美國國家標(biāo)準(zhǔn)代組織(ANSI)在1983年設(shè)立了一個(gè)委員會以發(fā)展一個(gè)新的標(biāo)準(zhǔn),該標(biāo)準(zhǔn)于1989年正式采用怖竭。這個(gè)新標(biāo)準(zhǔn)(ANSI C)定義了語言和一個(gè)標(biāo)準(zhǔn) C 庫锥债。國標(biāo)標(biāo)準(zhǔn)化組織于1990年采用一個(gè) C 標(biāo)準(zhǔn) (ISO C )。ISO C 和 ANSI C 實(shí)質(zhì)上是同一個(gè)標(biāo)準(zhǔn)痊臭。ANSI/ISO標(biāo)準(zhǔn)最終版本通常被稱為 C89 (因?yàn)?ANSI于1989年批準(zhǔn)了該標(biāo)準(zhǔn)) 或 C90(因?yàn)?ISO 于1990年批準(zhǔn)了該標(biāo)準(zhǔn))哮肚。然而,因?yàn)?ANSI版本是首先出現(xiàn)的广匙,所以人們通常使用ANSI C這一術(shù)語允趟。

C99標(biāo)準(zhǔn)

1994年,修訂標(biāo)準(zhǔn)的工作開始了鸦致,這一努力的結(jié)果是產(chǎn)生了 C99標(biāo)準(zhǔn)潮剪。一個(gè)聯(lián)合 ANSI/ISO委員會簽署了 C90標(biāo)準(zhǔn)的最初原則,包括保持言語短小而簡單分唾。他們的意圖不是為語言添加新的特性抗碰,而是為了滿足新的目標(biāo)。新目標(biāo)之一是支持國際化編程绽乔,例如弧蝇,提供了處理國際字符集的方法。第二個(gè)目標(biāo)是“整理現(xiàn)有的慣例以解決明顯的缺點(diǎn)”折砸。因此捍壤,在遇到需要將 C 移植到 64 位處理器時(shí),委員會根據(jù)在真實(shí)生活中處理問題的人的經(jīng)驗(yàn)來添加標(biāo)準(zhǔn)鞍爱。第三個(gè)目標(biāo)是針對科學(xué)和工程項(xiàng)目的重要數(shù)字計(jì)算改進(jìn) C 的適應(yīng)能力鹃觉。

國際化,修正其不足和改進(jìn)計(jì)算的實(shí)用性這三點(diǎn)是主要的面向改變的目標(biāo)睹逃。形成在關(guān)于更改的計(jì)劃在性質(zhì)上更加保守盗扇,例如,讓與 C90 和 C++ 的不兼容性達(dá)到最小沉填,讓語言在概念上保持簡單疗隶。肩帶來說就是希望 C++成為重要的和強(qiáng)有力的語言。

結(jié)果是 C99 的修改保持了 C 的本質(zhì)特性翼闹,C 繼續(xù)是一種簡短斑鼻,清楚,高效的語言猎荠。本書指出了 C99中的許多修改坚弱。因?yàn)槟壳按蠖鄶?shù)編譯器沒有完全實(shí)現(xiàn)所有 C99的修改蜀备,所以你可以會發(fā)現(xiàn)一些修改在你的系統(tǒng)上不可用』囊叮或者你可能會發(fā)現(xiàn)碾阁,只有修改編譯器的設(shè)置以后,才能夠看到一些 C99 的特性些楣。

小編推薦一個(gè)學(xué)C語言/C++的學(xué)習(xí)裙【 六九九脂凶,四七零,五九六 】愁茁,無論你是大牛還是小白蚕钦,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具鹅很,很多干貨和技術(shù)資料分享嘶居!

總結(jié)

C 是一種強(qiáng)大,簡潔的編程語言道宅。之所以流行是因?yàn)樗峁┝擞杏玫木幊坦ぞ吆蛯τ布己玫目刂剖程€因?yàn)?C 程序在從一個(gè)系統(tǒng)向另一個(gè)系統(tǒng)移植方面比大多數(shù)程序更容易。C 是一種需要編譯的語言污茵。C 編譯器和鏈接器是將 C 語言源代碼轉(zhuǎn)換成可執(zhí)行代碼的程序樱报。

用 C 編程可能很費(fèi)力,困難并讓你感到灰心泞当,但這一工作也可能讓你著迷迹蛤,興奮和感到滿意。

這些是C/C++能做的

服務(wù)器開發(fā)工程師襟士、人工智能盗飒、云計(jì)算工程師、信息安全(黑客反黑客)陋桂、大數(shù)據(jù) 逆趣、數(shù)據(jù)平臺、嵌入式工程師嗜历、流媒體服務(wù)器宣渗、數(shù)據(jù)控解、圖像處理梨州、音頻視頻開發(fā)工程師痕囱、游戲服務(wù)器、分布式系統(tǒng)暴匠、游戲輔助等

如果可以的話鞍恢,請大家多多轉(zhuǎn)發(fā)關(guān)注,謝謝支持!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帮掉,一起剝皮案震驚了整個(gè)濱河市弦悉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旭寿,老刑警劉巖警绩,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崇败,死亡現(xiàn)場離奇詭異盅称,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)后室,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門缩膝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岸霹,你說我怎么就攤上這事疾层。” “怎么了贡避?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵痛黎,是天一觀的道長。 經(jīng)常有香客問我刮吧,道長湖饱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任杀捻,我火速辦了婚禮井厌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘致讥。我一直安慰自己仅仆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布垢袱。 她就那樣靜靜地躺著墓拜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪请契。 梳的紋絲不亂的頭發(fā)上咳榜,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音姚糊,去河邊找鬼贿衍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛救恨,可吹牛的內(nèi)容都是我干的贸辈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼擎淤!你這毒婦竟也來了奢啥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘴拢,失蹤者是張志新(化名)和其女友劉穎桩盲,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體席吴,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赌结,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孝冒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柬姚。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖庄涡,靈堂內(nèi)的尸體忽然破棺而出量承,到底是詐尸還是另有隱情,我是刑警寧澤穴店,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布撕捍,位于F島的核電站,受9級特大地震影響泣洞,放射性物質(zhì)發(fā)生泄漏忧风。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一斜棚、第九天 我趴在偏房一處隱蔽的房頂上張望阀蒂。 院中可真熱鬧,春花似錦弟蚀、人聲如沸蚤霞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昧绣。三九已至,卻和暖如春捶闸,著一層夾襖步出監(jiān)牢的瞬間夜畴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工删壮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贪绘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓央碟,卻偏偏與公主長得像税灌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容