CC++語言0|C和C++的聯繫與區別

1 C語言

C語言之所以命名爲C,是因爲 C語言源自Ken Thompson發明的B語言,而 B語言則源自BCPL語言。

1967年,劍橋大學的Martin Richards對CPL語言進行了簡化,於是產生了BCPL(Basic Combined Programming Language)語言。並且他用B語言寫了第一個UNIX操作系統。

1972年,美國貝爾實驗室的 D.M.Ritchie 在B語言的基礎上最終設計出了一種新的語言,他取了BCPL的第二個字母作爲這種語言的名字,這就是C語言。
最後,如果大家如果在自學遇到困難,想找一個C++的學習環境,可以加入我們的C++學習圈,點擊我加入吧,會節約很多時間,減少很多在學習中遇到的難題。
CC++語言0|C和C++的聯繫與區別

C語言非常簡潔,只有32個關鍵字,9種控制語句,34種運算符。

具體來說,C語言是一個結構化語言,重點在於數據結構和算法的實現。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事物)控制)。

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

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

C語言是一種通用性的編程語言,它既具有高級語言的特點,又具有彙編語言的特點。,1978年後,C語言已先後被移植到大、中、小及微型機上,它可以作爲工作系統設計語言,編寫系統應用程序,也可以作爲應用程序設計語言,編寫不依賴計算機硬件的應用程序。它的應用範圍廣泛,具備很強的數據處理能力,不僅僅是在軟件開發上,而且各類科研都需要用到C語言,適於編寫系統軟件,三維,二維圖形和動畫,具體應用比如單片機以及嵌入式系統開發。儘管C語言是爲實現操作系統軟件而設計的,但它也廣泛的應用於開發便攜式應用軟件。

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

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

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

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

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

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

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

示例代碼:

#include <stdio.h>
int main(void)
{
printf("hello, world!n");
return 0;
}
2 C++語言

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

由此可見,C++是C的繼續和發展。C++功能強大,可以因應開發大型應用軟件。即可以面向對象,也可以兼容C,可以面向過程。

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

面向過程的思路:分析解決問題所需的步驟,用函數把這些步驟依次實現。

面向對象的思路:把構成問題的事務分解爲各個對象,建立對象的目的,不是完成一個步驟,而是描述某個事務在解決整個問題步驟中的行爲。

從上述描述可以看出,其實面向對象和麪向過程是兩種思考解決問題的方式,其差異主要在於思考的角度。

C++這個詞在中國大陸的程序員圈子中通常被讀做“C加加”,而西方的程序員通常讀做“C plus plus”,“CPP”。 它是一種使用非常廣泛的計算機編程語言。C++是一種靜態數據類型檢查的、支持多重編程範式的通用程序設計語言。它支持過程化程序設計、數據抽象、面向對象程序設計、泛型程序設計等多種程序設計風格。

C++是最流行的編程語言之一,它的應用領域涵蓋了系統軟件、應用軟件、驅動程序、嵌入式軟件、高性能的服務器與客戶端應用程序和諸如電視遊戲等娛樂軟件。

2.1 簡單(Simple)

C++是一種簡單的語言,它提供了結構化方法(將問題分解成幾個小部分),豐富的數據類型、庫函數集和類庫集等。

2.2 機器獨立或移植(Portable)

與彙編語言不同,C/C++語言程序可以在許多機器中執行,但可能有一點點或沒有變化。但它不是平臺無關的。

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

C++也用於做低級編程。它用於開發系統應用程序,如內核,驅動程序等。它還支持高級語言的特性。這就是爲什麼它被稱爲中級語言。

2.4 結構化編程語言(Structured)

C++是一種結構化編程語言,我們可以使用函數將程序分解爲多個小部分。所以,它很容易理解和修改。

2.5 豐富程序庫(Rich Library)

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

2.6 內存管理(Memory Management)

它支持動態內存分配的特性。在C++語言中,可以通過調用free()函數隨時釋放分配的內存。

2.7 運行速度快(Fast Speed)

C++語言的編譯和執行時間都非常快。

2.8 指針功能(Pointers)

C++提供指針的功能。可以通過使用指針直接與內存交互。我們可以使用內存,結構,函數,數組等指針。

2.9 遞歸(Recursion)

在C++中,可以調用函數內的函數。它爲每個函數提供代碼可重用性。

2.10 可擴展(Extensible)

C++語言是可擴展的,因爲它可以比較容易地採用新的功能。

2.11 面向對象(ObjectOriented)

C++是面向對象的編程(OOP)語言。OOP使開發和維護變得更容易,因爲在面向過程的編程語言中,如果代碼隨着項目規模的增長而增長,就不容易管理。

2.12 基於編譯器(Compiler based)

簡單講,編譯器就是將“一種語言(通常爲高級語言)”翻譯爲“另一種語言(通常爲低級語言)”的程序。一個現代編譯器的主要工作流程:源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目標代碼 (object code) → 鏈接器(Linker) → 可執行程序 (executables)。

示例代碼:

#include <iostream>
int main()
{
std::cout << "Hello, world!n";
}
3 C和C++的聯繫與區別

C語言是面向過程的編程,它最重要的特點是函數,通過main函數來調用各個子函數。程序運行的順序都是程序員事先決定好的。

C++是面向對象的編程,類產它的主要特點,在程序執行過程中,先由主main函數進入,定義一些類,根據需要執行類的成員函數,過程的概念被淡化了(實際上過程還是有的,就是主函數的哪些語句),以類驅動程序運行,類就是對象,所以我們稱之爲面向對象程序設計。面向對象在分析和解決問題的時候,將涉及到的數據和數據的操作封裝在類中,通過類可以創建對象,以事件或消息來驅動對象執行處理。

C語言和C++的最大區別在於它們解決問題的思想方法不一樣。C語言主要用於嵌入式領域,驅動開發等與硬件直接打交道的領域, C++可以用於應用層開發,用戶界面開發等於操作系統打交道的領域。

4 C++對C的“增強”

4.1 類型檢查更爲嚴格。

4.2 增加了面向對象的機制。

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

4.4 增加了異常處理。

4.5 增加了運算符重載。

4.6 增加了標準模板庫(STL)。

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

C++既繼承了C強大的底層操作特性,又被賦予了教科書式的面向對象機制。它特性繁多,有其他面嚮對象語言鮮見的多繼承,有耐人尋味的對值傳遞與引用傳遞以及const關鍵字,等等。C++就像是一把瑞士×××,或者像是一個工具箱,它爲你提供儘可能多的工具,多到讓不熟悉它的人無所適從,讓懂得如何使用它的人如魚得水。C++的種種特性使得它非常適合用來編寫底層數據結構,算法,庫等,是系統軟件開發以及數學模型構建等的強大武器庫,被譽爲工業級編程語言。

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

5 C++與C不兼容之處

上面說了C的大部分代碼在C++上都能run的溜溜的,但是也有少數C代碼會在C++中失效,或者在C++中有不同的行爲。例如:隱式轉換。

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

//從void*類型隱式轉換爲int*類型
int *i=malloc(sizeof(int)*5);

但要使其在C和C++兩者皆能運作,就需要使用顯式轉換:

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

5.2 在C中,多次聲明一個全局變量雖然不可取,但不算錯。在C++中,多次聲明同一個全局變量會引發錯誤。

5.3 另一個常見的可移植問題是,C++定義了新關鍵字,例如如new,class,它們在C程序中可以作爲識別字(例:變量名)的。

在C標準(C99)中去除了一些不兼容之處,也支持了一些C++的特性,如//註解,以及在代碼中混合聲明。不過C99也納入幾個和C++衝突的新特性(如:可變長度數組、原生複數類型和複合逐字常數)。

5.4 若要混用C和C++的代碼,則所有在C++中調用的C代碼,必須放在 extern "C" { / C代碼 / } 內。CC++語言0|C和C++的聯繫與區別

CC++語言0|C和C++的聯繫與區別
6 從C 到 C++ 的一些建議

6.1 慎用宏

6.1.1 用const替換#define宏替換

#define PAI 3.14 //慎用
const double PAI = 3.14 // 推薦

6.1.2 枚舉讓元素更有關聯性

#define ERROR 0
#define SUCCESS 1
// 推薦以下寫法
enum STATE{ERROR,SUCCESS}
6.1.3 用內聯函數代替帶參數的宏

#define max(a,b)((a)>(b)?(a):(b))
// 推薦以下寫法

inline int max(int a,int b){
return a > b ? a:b;
}
6.2 變量隨用隨聲明同時初始化

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

6.4 少用 void*,指針計算、聯合體和強制類型轉換

6.5 少用 c 風格的 char*,多用 string 表示字符串

-End-

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章