基本介紹
- 中文名:C語言
- 外文名:C&K
- 語言類別:電腦程式設計語言
- 產生時間:70年代初
概述,語言發展,子語言,設計原則,第一個Hello World程式,程式設計師的數量,語言的套用,編程技巧,使用new和delete進行動態記憶體分配和釋放,使用inline內連函式替代宏調用,使用函式重載,其它解釋,
概述
C語言對作業系統和系統使用程式以及需要對硬體進行操作的場合,用C語言明顯優於其它解釋型高級語言,有一些大型套用軟體也是用C語言編寫的。
C語言具有繪圖能力強,可移植性,並具備很強的數據處理能力,因此適於編寫系統軟體,三維,二維圖形和動畫。它是數值計算的高級語言。支持多重編程範式的通用程式設計語言。它支持過程化程式設計、數據抽象、面向對象程式設計、製作圖示等等泛型程式設計等多種程式設計風格。
語言發展
C語言是在70年代初問世的。一九七八年由美國電話電報公司AT&T貝爾實驗室的本賈尼·史特勞斯特盧普(BjarneStroustrup)博士在20世紀80年代初期發明並實現了C(最初這種語言被稱作“CwithClasses”)。同時由B.W.Kernighan和D.M.Ritchit合著了著名的“THECPROGRAMMINGLANGUAGE”一書。通常簡稱為《K&R》,也有人稱之為《K&R》標準。但是,在《K&R》中並沒有定義一個完整的標準C語言,後來由美國國家標準學會在此基礎上制定了一個C語言標準,於一九八三年發表。通常稱之為ANSIC。一開始C是作為C語言的增強版出現的,從給C語言增加類開始,不斷的增加新特性。虛函式(virtualfunction)、運算符重載(operatoroverloading)、多重繼承(multipleinheritance)、模板(template)、異常(exception)、RTTI、名字空間(namespace)逐漸被加入標準。1998年國際標準組織(ISO)頒布了C程式設計語言的國際標準ISO/IEC14882-1998。C是具有國際標準的程式語言,通常稱作ANSI/ISOC。1998年是C標準委員會成立的第一年,以後每5年視實際需要更新一次標準,下一次標準更新將是在2009年,目前我們一般稱該標準C0x。遺憾的是,由於C語言過於複雜,以及他經歷了長年的演變,直到現在(2004年)只有少數幾個編譯器完全符合這個標準(這么說也是不完全正確的,事實上,至今為止沒有任何一款編譯器完全支持ISOC)。
另外,就目前學習C而言,可以認為他是一門獨立的語言;他並不依賴C語言,我們可以完全不學C語言,而直接學習C。根據《C編程思想》(ThinkinginC)一書所評述的,C與C的效率往往相差在正負5%之間。所以有人認為在大多數場合C完全可以取代C語言(然而我們在單片機等需要謹慎利用空間、直接操作硬體的地方還是要使用C語言)。
總的來說,C語言發展大概可以分為三個階段:第一階段從80年代到1995年。這一階段C語言基本上是傳統類型上的面向對象語言,並且憑藉著接近C語言的效率,在工業界使用的開發語言中占據了相當大份額;第二階段從1995年到2000年,這一階段由於標準模板庫(STL)和後來的Boost等程式庫的出現,泛型程式設計在C中占據了越來越多的比重性。當然,同時由於Java、C#等語言的出現和硬體價格的大規模下降,C受到了一定的衝擊;第三階段從2000年至今,由於以Loki、MPL等程式庫為代表的產生式編程和模板元編程的出現,C出現了發展歷史上又一個新的高峰,這些新技術的出現以及和原有技術的融合,使C已經成為當今主流程式設計語言中最複雜的一員。
子語言
根據Effective C 第三版第一條款的描述,現在C 由以下四個“子語言”組成:
1、C子語言。C 支持C語言的幾乎全部功能,在語法上與C語言僅有極微妙的差別(如括弧表達式的左右值性,具體請參考C 標準文獻)。
2、面向對象的C 。C 首先作為一門面向對象的語言而聞名,這個特點在這裡不再詳述。
3、泛型程式語言。C 強大(但容易失控的)模板功能使它能在編譯期完成許多工作,從而大大提高運行期效率。
4、STL(C 標準模板庫)。隨著STL的不斷發展,它已經逐漸成為C 程式設計中不可或缺的部分,其效率可能比一般的naive代碼低些,但是其安全性與規範性使它大受歡迎。
設計原則
· C 設計成靜態類型、和C同樣高效且可移植的多用途程式設計語言。
· C 設計成給程式設計者更多的選擇,即使可能導致程式設計者選擇錯誤。
· C 設計成儘可能與C兼容,籍此提供一個從C到C 的平滑過渡。
· C 避免平台限定或沒有普遍用途的特性。
· C 不使用會帶來額外開銷的特性。
· C 設計成無需複雜的程式設計環境。
出於保證語言的簡潔和運行高效等方面的考慮,C 的很多特性都是以庫(如STL)或其他的形式提供的,而沒有直接添加到語言本身里。關於此類話題,C 之父的《C 語言的設計和演化》 里做了詳盡的陳述。
第一個Hello World程式
在使用兼容C89標準(也稱為ANSI C)的編譯器時,下面這個程式顯示“Hello, world!”然後結束運行:
(事實上這並不是符合98標準[ISO C ]的C 程式,而且在多數編譯器上這個程式也不能運行,若要在比較舊的編譯器上編譯該程式,應將iostream改為iostream.h)
#include
int main()
{
printf("Hello, world!\n");
return 0;
}
在使用兼容C 99標準(ISO/IEC 14882-1998)的編譯器時,下面的程式也是可以的:
#include
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
根據ISO C 的規定,main函式的形式只能是
int main(void)
{
...
}
以及
int main(int argc,char * argv[])
{
...
}
儘管如此,但在大部份(其實是在Windows平台下的大部分,主要是VC系列編譯器)編譯器上,
void main()
{
...
}
也被支持,但這並不正確,也不標準。這樣的寫法會使程式代碼喪失跨平台的特性。
程式設計師的數量
分析機構EvansData定期對開發人員展開調查,其調查結果與Stroustrup提出的C 正在擴張的說法相違背。EvansData的數據顯示,以C 為工具的開發人員在整個開發界所占的比例由1998年春天的76%下降至2004年秋的46%。
Forrester最新的調查顯示,C 、微軟VisualBasic和Java是眾多公司產品體系的首選語言。對100家公司的調查顯示,C/C 、VisualBasic和Java在產品體系中的使用比例分別是59%、61%和66%。
傳統上認為,C 相對於目前一些新潮的語言,如Java、C#,優勢在於程式的運行性能。這種觀念並不完全。如果一個人深信這一點,那么說明他並沒有充分了解和理解C 和那個某某語言。同時,持有這種觀念的人,通常也是受到了某種誤導(罪魁禍首當然就是那些財大氣粗的公司)。對於這些公司而言,他們隱藏了C 同某某語言間的核心差別,而把現在多數程式設計師不太關心的差別,也就是性能,加以強化。因為隨著CPU性能的快速提升,性能問題已不為人們所關心。這叫“李代桃僵”。很多涉世不深的程式設計師,也就相信了他們。於是,大公司們的陰謀也就得逞了。
一般認為,使用Java或C#的開發成本比C 低。但是,如果你能夠充分分析C 和這些語言的差別,會發現這句話的成立是有條件的。這個條件就是:軟體規模和複雜度都比較小。如果不超過3萬行有效代碼(不包括生成器產生的代碼),這句話基本上還能成立。否則,隨著代碼量和複雜度的增加,C 的優勢將會越來越明顯。造成這種差別的就是C 的軟體工程性。在Java和C#大談軟體工程的時候,C 實際上已經悄悄地將軟體工程性提升到一個前所未有的高度。這一點被多數人忽視,並且被大公司竭力掩蓋。
語言在軟體工程上的好壞,依賴於語言的抽象能力。從面向過程到面向對象,語言的抽象能力有了一個質的飛躍。但在實踐中,人們發現面向對象無法解決所有軟體工程中的問題。於是,精英們逐步引入、並拓展泛型編程,解決更高層次的軟體工程問題。(實際上,面向對象和泛型編程的起源都可以追溯到1967年,但由於泛型編程更抽象,所以套用遠遠落後於面向對象)。
語言的套用
哪些程式是用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
編程技巧
使用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);//動態分配一個整數並初始化
使用inline內連函式替代宏調用
對於頻繁使用的函式,C語言建議使用宏調用代替函式調用以加快代碼執行,減少調用開銷。但是宏調用有許多的弊端,可能引起不期望的副作用。例如宏:#define abs(a) ((a)<0?(-a):(a)), 當使用abs(i )時,這個宏就會出錯。
所以在C 中應該使用inline內連函式替代宏調用,這樣既可達到宏調用的目的,又避免了宏調用的弊端。
使用內連函式只須把inline關鍵字放在函式返回類型的前面。例如:
inline int Add(int a,int b);//聲明Add()為內連函式
使用函式重載
在C語言中,兩個函式的名稱不能相同,否則會導致編譯錯誤。而在C 中,函式名相同而參數數據類型不同的兩個函式被解釋為重載。例如:
void PutHz(char* str);//在當前位置輸出漢字
void PutHz(int x,
其它解釋
CK——CalvinKlein一個源於美國的品牌。集休閒、時尚、個性為一體,融入歐陸色彩,打造流行前沿,休閒簡易中不乏活潑、自然,動感中展現青春與美麗,是追求生活品質,重視休閒情趣女性的首選品牌。CK作為世界服裝界的知名品牌,已經享譽全球,在國內也有很高的知名度,以香水、服裝、皮具為主要產品。C&K作為CK的衍生品牌,又將此品牌賦予了新的含義:
C——Chinese東方神韻的代表,藝術魅力的詮釋
K——king權貴的象徵,世界流行潮流的起源
C&K的完美結合,體現了品牌獨特的創意,而又不失東方的優秀特性,是流行趨勢的代表,又不背棄生活,這就是C&K的品牌親和力。