標籤: 暫無標籤

C語言是一種面向過程的計算機程序設計語言。最初為unix而生。它既有高級語言的特點,又具有彙編語言的特點。它可以作為系統設計語言,編寫工作系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬體的應用程序。因此,它的應用範圍廣泛。

1 C -簡介

C++之父本賈尼·斯特勞斯特盧普C++之父本賈尼·斯特勞斯特盧普

美國AT&T貝爾實驗室的本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)博士在20世紀80年代初期發明並實現了C++(最初這種語言被稱作「C with Classes」)。一開始C++是作為C語言的增強版出現的,從給C語言增加類開始,不斷的增加新特性。虛函數(virtual function)、運算符重載(operator overloading)、多重繼承(multiple inheritance)、模板(template)、異常(exception)、RTTI、名字空間(name space)逐漸被加入標準。1998年國際標準組織(ISO)頒布了C++程序設計語言的國際標準ISO/IEC 14882-1998。C++是具有國際標準的編程語言,通常稱作ANSI/ISO C++。1998年是C++標準委員會成立的第一年,以後每5年視實際需要更新一次標準,下一次標準更新將是在2009年,目前我們一般稱該標準C++0x。遺憾的是,由於C++語言過於複雜,以及他經歷了長年的演變,直到現在(2004年)只有少數幾個編譯器完全符合這個標準(這麼說也是不完全正確的,事實上,至今為止沒有任何一款編譯器完全支持ISO C++)。 
另外,就目前學習C++而言,可以認為他是一門獨立的語言;他並不依賴C語言,我們可以完全不學C語言,而直接學習C++。根據《C++編程思想》(Thinking in C++)一書所評述的,C++與C的效率往往相差在正負5%之間。所以有人認為在大多數場合C++ 完全可以取代C語言(然而我們在單片機等需要謹慎利用空間、直接操作硬體的地方還是要使用C語言)。

子語言 根據Effective C++第三版第一條款的描述,現在C++由以下四個「子語言」組成:
1、C子語言。C++支持C語言的幾乎全部功能,在語法上與C語言僅有極微妙的差別(如括弧表達式的左右值性,具體請參考C++標準文獻)。
2、面向對象的C++。C++首先作為一門面向對象的語言而聞名,這個特點在這裡不再詳述。
3、泛型編程語言。C++強大(但容易失控的)模板功能使它能在編譯期完成許多工作,從而大大提高運行期效率。
4、STL(C++標準模板庫)。隨著STL的不斷發展,它已經逐漸成為C++程序設計中不可或缺的部分,其效率可能比一般的naive代碼低些,但是其安全性與規範性使它大受歡迎。

2 C -名字由來

C語言之所以要起名為「C」,是取的「BCPL」的第二個字母(第一個字母用來命名之前被發明的B語言) 。當C語言發展到頂峰的時刻,出現了一個版本叫C with Class,那就是C++最早的版本,在C語言中增加class關鍵字和類,那個時候有很多版本的C都希望在C語言中增加類的概念;後來C標準委員會決定為這個版本的C起個新的名字,那個時候徵集了很多種名字,最後採納了其中一個人的意見,以C語言中的++運算符來體現它是C語言的進步,故而叫C++,並成立了C++標準委員會。

3 C -發展歷史

本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)工作起於1979年的C with Classes。這個構思起源於本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)做博士論文時的一些程序撰寫經驗。他發現Simula具備很利於大型軟體開發的特點,但Simula的運行速度太慢,無法對現實需求發揮功效;BCPL雖快得多,但它過於低級的特性,使其不適於大型軟體的開發。當本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)開始在貝爾實驗室工作時,他有分析UNIX內核關於分散式計算的問題。回想起他的博士論文經驗,本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)開始為C語言增強一些類似Simula的特點。之所以選擇C,是因為它適於各種用途、快速和可移植性。除了C和Simula之外,同時也從其它語言中取得靈感,如ALGOL 68、Ada、CLU以及ML。剛開始時,類、派生類、儲存類型檢查、內聯和默認參數特性,都是通過Cfront引入C語言之中。1985年10月出現了第一個商業化發布。
1983年,C with Classes改命名為C++。加入了新的特性,其中包括虛函數、函數名和運算符重載、參考、常數、用戶可控制的自由空間儲存區控制、改良的型別檢查,以及新的雙斜線(//)單行註解風格。1985年,發布第一版《C++程序設計語言》,提供一個重點的語言參考,至此還不是官方標準。1989年,發布了Release 2.0,引入了多重繼承、抽象類、靜態成員函數、常數成員函數,以及成員保護。1990年,出版了The Annotated C++ Reference Manual。這本書後來成為標準化的基礎。稍後還引入了模板、異常處理、命名空間、新的強制轉型,以及布林型別。
隨著C++語言的演變,也逐漸演化出相應的標準程序庫。最先加進C++標準函數庫的是流式I/O程序庫,其用以取代傳統的C函數,如printf和scanf。隨後所引入的程序庫中最重要的便是標準模板庫,簡稱STL。
多年後,一個聯合的ANSI-ISO委員會於1998年對C++標準化(ISO/IEC 14882:1998)。在官方釋出1998標準的若干年後,委員會處理缺陷報告,並於2003年發布一個C++標準的修正版本。2005年,一份名為Library Technical Report 1(簡稱TR1)的技術報告釋出。雖然還不是官方標準的一部分,不過它所提供的幾個擴展可望成為下一版C++標準的一部分。幾乎所有目前仍在維護的C++編譯器皆已支持TR1。
雖然C++免專利,但標準文件本身並不是免費的。

4 C -語言發展

C++語言發展大概可以分為三個階段:
第一階段從80年代到1995年。這一階段C++語言基本上是傳統類型上的面向對象語言,並且憑藉著接近C語言的效率,在工業界使用的開發語言中佔據了相當大份額;
第二階段從1995年到2000年,這一階段由於標準模板庫(STL)和後來的Boost等程序庫的出現,泛型程序設計在C++中佔據了越來越多的比重性。當然,同時由於Java、C#等語言的出現和硬體價格的大規模下降,C++受到了一定的衝擊;
第三階段從2000年至今,由於以Loki、MPL等程序庫為代表的產生式編程和模板元編程的出現,C++出現了發展歷史上又一個新的高峰,這些新技術的出現以及和原有技術的融合,使C++已經成為當今主流程序設計語言中最複雜的一員。

5 C -設計原則

• C++設計成靜態類型、和C同樣高效且可移植的多用途程序設計語言。 
• C++設計成直接的和廣泛的支援多種程序設計風格(程序化程序設計、資料抽象化、面向對象程序設計、泛型程序設計)。 
• C++設計成給程序設計者更多的選擇,即使可能導致程序設計者選擇錯誤。 
• C++設計成儘可能與C兼容,籍此提供一個從C到C++的平滑過渡。 
• C++避免平台限定或沒有普遍用途的特性。 
• C++不使用會帶來額外開銷的特性。 
• C++設計成無需複雜的程序設計環境。
出於保證語言的簡潔和運行高效等方面的考慮,C++的很多特性都是以庫(如STL)或其他的形式提供的,而沒有直接添加到語言本身里。關於此類話題,C++之父的《C++語言的設計和演化》 里做了詳盡的陳述。 

6 C -標準程序庫

1998的C++標準分為兩個部分:核心語言和C++標準程序庫;後者包含了大部分標準模板庫和C標準程序庫的稍加修改版本。存在許多不屬於標準部分的C++程序庫,且使用外部鏈接,程序庫甚至可以用C撰寫。
C++標準程序庫充分吸收了C標準程序庫,並佐以少許的修改,使其與C++良好的運作。另一個大型的程序庫部分,是以標準模板庫(STL)為基礎,STL於1994年2月正式成為ANSI/ISO C++。它提供了實用的工具,如容器(如:矢量和鏈表),迭代器(一般化指針)提供容器以類似數組的訪問方式,以及演算法進行搜索和排序的運算。此外還提供了(multi)map(關係數組)和(multi)set,它們都使用兼容的界面。因此,以下成為可能,使用模板撰寫泛型演算法,它可以和任何容器或在任何以迭代器定義的串列上運作。如同C,使用#include指令包含標準表頭,即可訪問程序庫里的功能。C++提供69個標準表頭,其中19個不再贊成使用。
使用標準庫(例如:使用std::vector或std::string來取代C風格的數組)有助於導向更安全和更靈活的軟體。
STL在納入C++標準以前,是來自HP和後來的SGI的第三方程式庫,標準中並未稱之為「STL」,它只是標準庫中的一部分,但仍有許多人使用這個名稱,以別於其它的標準庫(輸入/輸出流、國際化、診斷、C程序庫子集,等等)。

7 C -Hello World程序

在使用兼容C89標準(也稱為ANSI C)的編譯器時,下面這個程序顯示「Hello, world!」然後結束運行:
#include <iostream>
int main()
{
    std::cout<<"Hello,world!\n";
}  

在使用兼容C99標準(ISO/IEC 14882-1998)的編譯器時,下面的程序也是可以的:

#include <iostream>
int main()
{
    std::cout << "Hello, world!" <<std::endl;
    return 0;

根據ISO C++的規定,main函數的形式只能是:
int main()
以及:
int main(int argc, char * argv[])
儘管如此,但在大部份(其實是在Windows平台下的大部分,主要是VC系列編譯器)編譯器上也被支持,但這並不正確,也不標準。這樣的寫法會使程序代碼喪失跨平台的特性。  
void main()//雖然目前很多教科書採用這種寫法,但是這種寫法強烈不建議.

8 C -語言的應用

哪些程序是用C++寫的:
主流的3種操作系統Windows,Linux,Unix,內核都是用C語言和彙編寫的,上層高級特性是用C++寫的。
《魔獸世界》等幾乎所有的網路遊戲,百度搜索引擎(Baidu.com),我們所用的大多數軟體都是用C++寫的(硬體也有很多用到C++的)。
C++之父Bjarne Stroustrup列舉的C++應用:
Amazon.com:Software for large-scale e-commerce
Apple: OS X is written in a mix of language, but a few important parts are C++. The two most interesting are 
AT&T:The largest US telecommunications provider. 
o provisioning systems 
o systems for rapid network recovery after failure
Autodesk: A large number of major number of application in the CAD domain
Ericsson:o server platform.
o TDMA-CDMA HLR
o GSM-TDMA-CDMA mobility gateway
Google: web search engine, etc.
HP: Here is a tiny fraction of HP's C++ apps: 
o C, C++, Fortran90 compilers, and linker for the new HP IA64 platform (these add to more than 1 million lines of C++ code).
IBM: o OS/400. 
o K42: a high performance, open source, general-purpose operating system kernel for cache-coherent multiprocessors.
Intel:o Vtune performace analysis software 
o compilers and optimizers 
o lots of chip design and manufacturing software
JPL (Jet Propulsion Lab, NASA): Mars rover autonomous driving system (incl. scene analysis and route planning). C++ on Mars! Also lots of supporting software "on the ground" (i.e. Earth).
Microsoft:o Windows XP 
o Windows NT (NT4 and 2000) 
o Windows 9x (95, 98, Me) 
o Microsoft Office (Word, Excel, Access, PowerPoint, Outlook) 
o Internet Explorer (including Outlook Express) 
o Visual Studio 
o SQL
Mozilla: Firefox browser and Thunderbird mail client (open source)
MySQL: MySQL Server (about 250,000 lines of C++) and MySQL Cluster. Arguably the world's most popular open source database
Nokia: o Mobile Communications radio-station/internet bridges: FlexiGGSN (Gateway GPRS Support Node) and FlexiSGSN (Server GPRS Support Node). 
o MSC/HLR 
Sun: o The HotSpot Java Virtual Machine is written in C++
Symbian OS: rationale: "[...] using C++ for all system code, from the kernel upwards." This is one of the most widespread OS's for cellular phones
KDE from linux is written in C++.
telephone systems: I think it would be almost easier to list the systems which aren't written in C++
C++寫出的軟體,還包括VLC, 著名的開源視頻播放器;
LAMMPS,著名分子動力學模擬軟體,其中包括一部分Fortran代碼;

9 C -編程技巧

一、使用new和delete進行動態內存分配和釋放
運算符new和delete是C++新增的運算符,提供了存儲的動態分配和釋放功能。它的作用相當於C語言的函數malloc()和free(),但是性能更為優越。使用new較之使用malloc()有以下的幾個優點: 
(1)new自動計算要分配類型的大小,不使用sizeof運算符,比較省事,可以避免錯誤。 
(2)自動地返回正確的指針類型,不用進行強制指針類型轉換。 
(3)可以用new對分配的對象進行初始化。 
使用例子: 
(1)int* p; 
     p = new int[10]; //分配一個含有10個整數的整形數組 
     delete [] p; //刪除這個數組 
(2)int* p; 
     p = new int (100);//動態分配一個整數並初始化
     delete p;
二、使用inline內連函數替代宏調用
對於頻繁使用的函數,C語言建議使用宏調用代替函數調用以加快代碼執行,減少調用開銷。但是宏調用有許多的弊端,可能引起不期望的副作用。例如宏:#define abs(a) ((a)<0?(-a):(a)), 當使用abs(i++)時,這個宏就會出錯。 
所以在C++中應該使用inline內連函數替代宏調用,這樣既可達到宏調用的目的,又避免了宏調用的弊端。 
使用內連函數只須把inline關鍵字放在函數返回類型的前面。例如: 
inline int Add(int a,int b);//聲明Add()為內連函數 
這樣編譯器在遇到Add()函數時,就不再進行函數調用,而是直接嵌入函數代碼以加快程序的執行。 
三、使用函數重載
在C語言中,兩個函數的名稱不能相同,否則會導致編譯錯誤。而在C++中,函數名相同而參數數據類型不同的兩個函數被解釋為重載。例如: 
void PutHz(char* str);//在當前位置輸出漢字 
void PutHz(int x,int y,char * str);//在x,y處輸入數字 
使用函數重載可以幫助程序員處理更多的複雜問題,避免了使用諸如intabs()、fabs()、dabs()等繁雜的函數名稱;同時在大型程序中,使函數名易於管理和使用,而不必絞盡腦汁地去處理函數名。同時必須注意,參數數據類型相同,但是函數返回類型不同的兩個函數不能重載。
四、使用引用(reference)代替指針進行參數傳遞
在C語言中,如果一個函數需要修改用作參數的變數值的時候 ,參數應該聲明為指針類型。例如: 
void Add(int *a)
{
     *a++;
}
調用時則使用 
Add(&x); //其中x為int或可以轉化為int的類型,如unsigned int, 但這時候編譯器通過回給出warning
對於複雜的程序,使用指針容易出錯,程序也難以讀懂。在C++中,對於上述情況 可以使用引用來代替指針,使程序更加清晰易懂。引用就是對變數取的一個別名,對引用進行操作,這就相當於對原有變數進行操作。例如使用引用的函數定義為: 
void Add(int& a)
{
     a++; //a為一個整數的引用 
}
調用時使用 
Add(x); //其中x為int
這個函數與使用指針的上一個函數的功能是一樣的,然而代碼卻更為簡潔和清晰易懂。 
五、使用預設參數
在C++中函數可以使用預設參數,例如: 
void PutHzxy(char *str,int x=-1, int y=-1)
{
     if(x==-1)
x=wherex();
     if(y==-1)
x=wherex();
     moveto(x,y);
     PutHx(str);
}
可以有三種方式調用函數PutHzxy(),例如: 
PutHzxy("C++語言");//使用預設參數在當前位置輸出 
PutHzxy("C++語言",10,10);//沒有使用預設參數 
PutHzxy("C++語言",10);//對y使用預設參數,指定x的位置
通常的情況下,一個函數應該具有儘可能大的靈活性。使用預設參數為程序員處理更大的複雜性和靈活性問題提供了有效的方法,所以在C++的代碼中都大量地使用了預設參數。 
需要說明的是,所有的預設參數必須出現在不預設參數的右邊。亦即,一旦開始定義預設參數,就不可再說明非預設的參數。 
例如: 
void PutHzxy(char*str,int x=-1,int y=-1)//正確 
void PutHzxy(int x=-1,int y=-1,char*str)//錯誤 
六、使用STL
STL(Standard Template Library,標準模板庫), STL的代碼從廣義上講分為三類:algorithm(演算法)、container(容器)和iterator(迭代器),並包括一些工具類如auto_ptr(C++11不建議使用,使用unique_ptr代替auto_ptr)。幾乎所有的代碼都採用了模板類和模版函數的方式,這相比於傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。
#include <iostream>
#include <vector>// 包含相關的頭文件/
int main()
{
    std::vector<int> vi;
    for(int i = 0;i < 10;i++)
vi.push_back(i);      //使用push_back添加元素
    for(int i = 0;i < vi.size();i++)
std::cout<<vi[i]<<" ";//[]操作符被std::vector重載,使得我們可以像訪問數組一樣訪問vector中的元素
    for(std::vector<int>::iterator i = vi.begin(); i != vi.end();++i)
std::cout<< *i <<" "; //使用iterator遍歷訪問vi中的元素並輸出,效果和上一句一樣
}

10 C -集成開發環境

1.visual studio(visual C++)
Microsoft Visual C++6.0Microsoft Visual C++6.0版本
 
2.Borland C++ 
3.C++ Builder 
4.eclipse(CDT)
5.Dev-C++
6.Code::Blocks
特註:Microsoft Visual C++並不嚴格遵循標準C++標準(尤其是VC6.0版本),在很多方面,與標準C++標準相左(不過在VC8、VC9版本中對C++標準的支持還是有很大的提高的)。比如,標準C++規定,過程內的變數生存期僅是該過程。但是,在VC++6.0中,
for(int i = 0;i < 7;i++){
//......
}
這樣的語句后,i仍然是認為已經聲明過,在VC++8.0及其後續版本中才更正支持了這一標準。
對C++標準符合度較高的是BCB(Borland C Builder),GCC等編譯器。

11 C -著作

●《The C++ Standard Library: A Tutorial and Reference》原文版 
中文版:《C++標準程序庫:自修教程與參考手冊》 
百科全書式的C++標準庫著作,一本需要一再查閱的參考大全。本書詳細介紹了每一標準庫組件的規格和用法,內容涵蓋包括流和本地化在內的整個標準庫而不僅僅是STL。正如本書副標題所示,它首先適合作為教程閱讀,爾後又可用作參考手冊。 淺顯易懂的寫作風格使得這本書非常易讀。 
●《Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference》原文版 
中文版《標準C++輸入輸出流與本地化》 
C++標準庫由STL、流和本地化三部分構成。關於STL的書市面上已經有不少,但罕見流和本地化方面的專著。此書是這兩個領域中最優秀的一本,迄今為止沒有任何一本書比這一本更全面詳盡地討論了流和本地化。 
● 《Effective STL》  使用STL的程序員必讀之作。在這本書中,Scott講述了STL容器和演算法的工作機制以及如何以最佳方式使用它們。和Scott的其他作品一樣,這本書的寫作風格清晰、精確,具有極佳的可讀性。
●影印版《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》
中文版《泛型編程與STL》
這本書散發著濃厚的學院氣息。Andrew Koenig和Barbara Moo在《Accelerated C++: Practical Programming by Example》一書末尾鄭重推薦另外兩本進階好書(除了他們自己的《Ruminations on C++》外),其中一本是TCPL,另外一本就是本書。
●Douglas C. Schmidt, Stephen D. Huston,《C++ Network Programming》

Volume 1: Mastering Complexity with ACE and Patterns;

Volume 2: Systematic Reuse with ACE and Frameworks;

中文版:《C++網路編程》 等等。

12 C -優點

Microsoft Visual C++6.0Microsoft Visual C++6.0

  C++是一種絕對不會試圖迎合某個模子的語言。特別是它的形式可以變化多端,以解決不同類型的問題。這主要反映在象Microsoft Visual C++和Borland C++ Builder那樣的工具身上。它們將庫、組件模型以及代碼生成工具等合成到一起,以開發視窗化的末端用戶應用(用於Microsoft Windows操作系統)。

13 C -爭議

C++語言由於過度的複雜性,以及與unix的文化相抵觸,在unix/linux是接受到很多著名人士(比如Linux之父linus torvalds與著名黑客Eric S. Raymond)的強烈批評與抵制。 
參見《unix編程藝術》對c++的批評。


上一篇[摩洛哥迪拉姆]    下一篇 [用戶]

相關評論

同義詞:暫無同義詞