CC++語言0|C和C++的聯(lián)系與區(qū)別

1 C語言

C語言之所以命名為C,是因?yàn)?C語言源自Ken Thompson發(fā)明的B語言,而 B語言則源自BCPL語言。

1967年,劍橋大學(xué)的Martin Richards對(duì)CPL語言進(jìn)行了簡(jiǎn)化,于是產(chǎn)生了BCPL(Basic Combined Programming Language)語言。并且他用B語言寫了第一個(gè)UNIX操作系統(tǒng)。

1972年,美國(guó)貝爾實(shí)驗(yàn)室的 D.M.Ritchie 在B語言的基礎(chǔ)上最終設(shè)計(jì)出了一種新的語言,他取了BCPL的第二個(gè)字母作為這種語言的名字,這就是C語言。

最后,如果大家如果在自學(xué)遇到困難,想找一個(gè)C++的學(xué)習(xí)環(huán)境,可以加入我們的C++學(xué)習(xí)圈,點(diǎn)擊我加入吧,會(huì)節(jié)約很多時(shí)間,減少很多在學(xué)習(xí)中遇到的難題。


C語言非常簡(jiǎn)潔,只有32個(gè)關(guān)鍵字,9種控制語句,34種運(yùn)算符。

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

C語言可以做任何用處,但最大的用處還是寫寫操作系統(tǒng)和編譯器之類的。

C 語言是非常有效率的,很多時(shí)候你都需要考慮內(nèi)存的管理等底層的東西。很可惜這些都需要你去花很多的時(shí)間去做。作為一種底層編程語言,可以通過指針進(jìn)行很直接的內(nèi)存管理,另外,很多語言都是用 C 來設(shè)計(jì)的, 比如 perl , java, python。

C語言是一種通用性的編程語言,它既具有高級(jí)語言的特點(diǎn),又具有匯編語言的特點(diǎn)。,1978年后,C語言已先后被移植到大、中、小及微型機(jī)上,它可以作為工作系統(tǒng)設(shè)計(jì)語言,編寫系統(tǒng)應(yīng)用程序,也可以作為應(yīng)用程序設(shè)計(jì)語言,編寫不依賴計(jì)算機(jī)硬件的應(yīng)用程序。它的應(yīng)用范圍廣泛,具備很強(qiáng)的數(shù)據(jù)處理能力,不僅僅是在軟件開發(fā)上,而且各類科研都需要用到C語言,適于編寫系統(tǒng)軟件,三維,二維圖形和動(dòng)畫,具體應(yīng)用比如單片機(jī)以及嵌入式系統(tǒng)開發(fā)。盡管C語言是為實(shí)現(xiàn)操作系統(tǒng)軟件而設(shè)計(jì)的,但它也廣泛的應(yīng)用于開發(fā)便攜式應(yīng)用軟件。

1.1 C語言是一個(gè)有結(jié)構(gòu)化程序設(shè)計(jì)、具有變量作用域(variable scope)以及遞歸功能的過程式語言。

1.2 C語言傳遞參數(shù)有值傳遞(pass by value)和指針傳遞(a pointer passed by value)兩種方式。

1.3 不同的變量類型可以用結(jié)構(gòu)體(struct)組合在一起。

1.4 只有32個(gè)保留字(reserved keywords),使變量、函數(shù)命名有更多彈性。

1.5 部份的變量類型可以轉(zhuǎn)換,例如整型和字符型變量。

1.6 通過指針(pointer),C語言可以容易的對(duì)存儲(chǔ)器進(jìn)行低級(jí)控制。

1.7 預(yù)編譯處理(preprocessor)讓C語言的編譯更具有彈性。

示例代碼:

#include

int main(void)

{

printf("hello, world!n");

return 0;

}

2 C++語言

20世紀(jì)70年代中期,Bjarne Stroustrup在劍橋大學(xué)計(jì)算機(jī)中心工作。他使用過Simula和ALGOL,接觸過C。他對(duì)Simula的類體系感受頗深,對(duì)ALGOL的結(jié)構(gòu)也很有研究,深知運(yùn)行效率的意義。既要編程簡(jiǎn)單、正確可靠,又要運(yùn)行高效、可移植,是Bjarne Stroustrup的初衷。以C為背景,以Simula思想為基礎(chǔ),正好符合他的設(shè)想。1979年,Bjame Sgoustrup到了Bell實(shí)驗(yàn)室,開始從事將C改良為帶類的C(C with classes)的工作。1983年該語言被正式命名為C++。

由此可見,C++是C的繼續(xù)和發(fā)展。C++功能強(qiáng)大,可以因應(yīng)開發(fā)大型應(yīng)用軟件。即可以面向?qū)ο?,也可以兼容C,可以面向過程。

C++是一種復(fù)雜、難以掌握的語言,不僅體現(xiàn)在其語法,更體現(xiàn)在其提供了4種編程思維模型上面,包括:procedural-based, object-based, object-oriented, generic paradigm。由此C++是既有效率,又有彈性;既可以面向?qū)ο?,又兼容面向過程。

面向過程的思路:分析解決問題所需的步驟,用函數(shù)把這些步驟依次實(shí)現(xiàn)。

面向?qū)ο蟮乃悸罚喊褬?gòu)成問題的事務(wù)分解為各個(gè)對(duì)象,建立對(duì)象的目的,不是完成一個(gè)步驟,而是描述某個(gè)事務(wù)在解決整個(gè)問題步驟中的行為。

從上述描述可以看出,其實(shí)面向?qū)ο蠛兔嫦蜻^程是兩種思考解決問題的方式,其差異主要在于思考的角度。

C++這個(gè)詞在中國(guó)大陸的程序員圈子中通常被讀做“C加加”,而西方的程序員通常讀做“C plus plus”,“CPP”。 它是一種使用非常廣泛的計(jì)算機(jī)編程語言。C++是一種靜態(tài)數(shù)據(jù)類型檢查的、支持多重編程范式的通用程序設(shè)計(jì)語言。它支持過程化程序設(shè)計(jì)、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計(jì)、泛型程序設(shè)計(jì)等多種程序設(shè)計(jì)風(fēng)格。

C++是最流行的編程語言之一,它的應(yīng)用領(lǐng)域涵蓋了系統(tǒng)軟件、應(yīng)用軟件、驅(qū)動(dòng)程序、嵌入式軟件、高性能的服務(wù)器與客戶端應(yīng)用程序和諸如電視游戲等娛樂軟件。

2.1 簡(jiǎn)單(Simple)

C++是一種簡(jiǎn)單的語言,它提供了結(jié)構(gòu)化方法(將問題分解成幾個(gè)小部分),豐富的數(shù)據(jù)類型、庫(kù)函數(shù)集和類庫(kù)集等。

2.2 機(jī)器獨(dú)立或移植(Portable)

與匯編語言不同,C/C++語言程序可以在許多機(jī)器中執(zhí)行,但可能有一點(diǎn)點(diǎn)或沒有變化。但它不是平臺(tái)無關(guān)的。

2.3 中級(jí)編程語言(Mid-level)

C++也用于做低級(jí)編程。它用于開發(fā)系統(tǒng)應(yīng)用程序,如內(nèi)核,驅(qū)動(dòng)程序等。它還支持高級(jí)語言的特性。這就是為什么它被稱為中級(jí)語言。

2.4 結(jié)構(gòu)化編程語言(Structured)

C++是一種結(jié)構(gòu)化編程語言,我們可以使用函數(shù)將程序分解為多個(gè)小部分。所以,它很容易理解和修改。

2.5 豐富程序庫(kù)(Rich Library)

C++提供了許多內(nèi)置函數(shù)(程序庫(kù)),一些常用的功能不用再去重頭開始編寫,有助于提高開發(fā)速度。

2.6 內(nèi)存管理(Memory Management)

它支持動(dòng)態(tài)內(nèi)存分配的特性。在C++語言中,可以通過調(diào)用free()函數(shù)隨時(shí)釋放分配的內(nèi)存。

2.7 運(yùn)行速度快(Fast Speed)

C++語言的編譯和執(zhí)行時(shí)間都非常快。

2.8 指針功能(Pointers)

C++提供指針的功能??梢酝ㄟ^使用指針直接與內(nèi)存交互。我們可以使用內(nèi)存,結(jié)構(gòu),函數(shù),數(shù)組等指針。

2.9 遞歸(Recursion)

在C++中,可以調(diào)用函數(shù)內(nèi)的函數(shù)。它為每個(gè)函數(shù)提供代碼可重用性。

2.10 可擴(kuò)展(Extensible)

C++語言是可擴(kuò)展的,因?yàn)樗梢员容^容易地采用新的功能。

2.11 面向?qū)ο?ObjectOriented)

C++是面向?qū)ο蟮木幊?OOP)語言。OOP使開發(fā)和維護(hù)變得更容易,因?yàn)樵诿嫦蜻^程的編程語言中,如果代碼隨著項(xiàng)目規(guī)模的增長(zhǎng)而增長(zhǎng),就不容易管理。

2.12 基于編譯器(Compiler based)

簡(jiǎn)單講,編譯器就是將“一種語言(通常為高級(jí)語言)”翻譯為“另一種語言(通常為低級(jí)語言)”的程序。一個(gè)現(xiàn)代編譯器的主要工作流程:源代碼 (source code) → 預(yù)處理器 (preprocessor) → 編譯器 (compiler) → 目標(biāo)代碼 (object code) → 鏈接器(Linker) → 可執(zhí)行程序 (executables)。

示例代碼:

#include

int main()

{

std::cout << "Hello, world!n";

}

3 C和C++的聯(lián)系與區(qū)別

C語言是面向過程的編程,它最重要的特點(diǎn)是函數(shù),通過main函數(shù)來調(diào)用各個(gè)子函數(shù)。程序運(yùn)行的順序都是程序員事先決定好的。

C++是面向?qū)ο蟮木幊?,類產(chǎn)它的主要特點(diǎn),在程序執(zhí)行過程中,先由主main函數(shù)進(jìn)入,定義一些類,根據(jù)需要執(zhí)行類的成員函數(shù),過程的概念被淡化了(實(shí)際上過程還是有的,就是主函數(shù)的哪些語句),以類驅(qū)動(dòng)程序運(yùn)行,類就是對(duì)象,所以我們稱之為面向?qū)ο蟪绦蛟O(shè)計(jì)。面向?qū)ο笤诜治龊徒鉀Q問題的時(shí)候,將涉及到的數(shù)據(jù)和數(shù)據(jù)的操作封裝在類中,通過類可以創(chuàng)建對(duì)象,以事件或消息來驅(qū)動(dòng)對(duì)象執(zhí)行處理。

C語言和C++的最大區(qū)別在于它們解決問題的思想方法不一樣。C語言主要用于嵌入式領(lǐng)域,驅(qū)動(dòng)開發(fā)等與硬件直接打交道的領(lǐng)域, C++可以用于應(yīng)用層開發(fā),用戶界面開發(fā)等于操作系統(tǒng)打交道的領(lǐng)域。

4 C++對(duì)C的“增強(qiáng)”

4.1 類型檢查更為嚴(yán)格。

4.2 增加了面向?qū)ο蟮臋C(jī)制。

4.3 增加了泛型編程的機(jī)制(Template)。

4.4 增加了異常處理。

4.5 增加了運(yùn)算符重載。

4.6 增加了標(biāo)準(zhǔn)模板庫(kù)(STL)。

4.7 增加了命名空間,避免全局命名沖突。

C++既繼承了C強(qiáng)大的底層操作特性,又被賦予了教科書式的面向?qū)ο髾C(jī)制。它特性繁多,有其他面向?qū)ο笳Z言鮮見的多繼承,有耐人尋味的對(duì)值傳遞與引用傳遞以及const關(guān)鍵字,等等。C++就像是一把瑞士軍刀,或者像是一個(gè)工具箱,它為你提供盡可能多的工具,多到讓不熟悉它的人無所適從,讓懂得如何使用它的人如魚得水。C++的種種特性使得它非常適合用來編寫底層數(shù)據(jù)結(jié)構(gòu),算法,庫(kù)等,是系統(tǒng)軟件開發(fā)以及數(shù)學(xué)模型構(gòu)建等的強(qiáng)大武器庫(kù),被譽(yù)為工業(yè)級(jí)編程語言。

C的大部分代碼在C++上都能應(yīng)用,而C++的代碼在C上不能應(yīng)用。(記住是大部分,不是所有)。

5 C++與C不兼容之處

上面說了C的大部分代碼在C++上都能run的溜溜的,但是也有少數(shù)C代碼會(huì)在C++中失效,或者在C++中有不同的行為。例如:隱式轉(zhuǎn)換。

5.1 最常見的差異之一是,C允許從void*隱式轉(zhuǎn)換到其它的指針類型,但C++不允許。下列是有效的C代碼:

//從void*類型隱式轉(zhuǎn)換為int*類型

int *i=malloc(sizeof(int)*5);

但要使其在C和C++兩者皆能運(yùn)作,就需要使用顯式轉(zhuǎn)換:

int *i=(int*)malloc(sizeof(int)*5);

5.2 在C中,多次聲明一個(gè)全局變量雖然不可取,但不算錯(cuò)。在C++中,多次聲明同一個(gè)全局變量會(huì)引發(fā)錯(cuò)誤。

5.3 另一個(gè)常見的可移植問題是,C++定義了新關(guān)鍵字,例如如new,class,它們?cè)贑程序中可以作為識(shí)別字(例:變量名)的。

在C標(biāo)準(zhǔn)(C99)中去除了一些不兼容之處,也支持了一些C++的特性,如//注解,以及在代碼中混合聲明。不過C99也納入幾個(gè)和C++沖突的新特性(如:可變長(zhǎng)度數(shù)組、原生復(fù)數(shù)類型和復(fù)合逐字常數(shù))。

5.4 若要混用C和C++的代碼,則所有在C++中調(diào)用的C代碼,必須放在 extern "C" { /* C代碼 */ } 內(nèi)。

6 從C 到 C++ 的一些建議

6.1 慎用宏

6.1.1 用const替換#define宏替換

#define PAI 3.14 //慎用

const double PAI = 3.14 // 推薦

6.1.2 枚舉讓元素更有關(guān)聯(lián)性

#define ERROR 0

#define SUCCESS 1

// 推薦以下寫法

enum STATE{ERROR,SUCCESS}

6.1.3 用內(nèi)聯(lián)函數(shù)代替帶參數(shù)的宏

#define max(a,b)((a)>(b)?(a):(b))

// 推薦以下寫法

inline int max(int a,int b){

return a > b ? a:b;

}

6.2 變量隨用隨聲明同時(shí)初始化

6.3 盡量使用 new/delete 取代 malloc/free

6.4 少用 void*,指針計(jì)算、聯(lián)合體和強(qiáng)制類型轉(zhuǎn)換

6.5 少用 c 風(fēng)格的 char*,多用 string 表示字符串

-End-

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容