C語(yǔ)言不僅是IT的必修課,也是所有理工科、甚至所有專業(yè)的必修課。它具有簡(jiǎn)潔緊湊、靈活方便、適用范圍大、可移植等優(yōu)點(diǎn),是應(yīng)用最為廣泛的一種高級(jí)程序設(shè)計(jì)語(yǔ)言。
計(jì)算機(jī)語(yǔ)言概述
計(jì)算機(jī)語(yǔ)言是用于人與計(jì)算機(jī)間通信的語(yǔ)言,為使計(jì)算機(jī)進(jìn)行各種不同的工作,就需要有一種專門用來(lái)編寫計(jì)算機(jī)程序的字符、數(shù)字和語(yǔ)法規(guī)則,而這些規(guī)則構(gòu)成計(jì)算機(jī)的指令。計(jì)算機(jī)語(yǔ)言分機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言3種,下面將分別進(jìn)行詳細(xì)講解。
機(jī)器語(yǔ)言
計(jì)算機(jī)工作基于二進(jìn)制,它只能識(shí)別和接受由1和0組成的指令,其中1表示通電,0表示斷電,這種計(jì)算機(jī)能直接識(shí)別和接受的二進(jìn)制代碼稱為機(jī)器指令。機(jī)器指令的集合就是該計(jì)算機(jī)的機(jī)器語(yǔ)言,機(jī)器語(yǔ)言具有靈活、直接執(zhí)行和速度快等特點(diǎn)。不同型號(hào)的計(jì)算機(jī)其機(jī)器語(yǔ)言是不相通的,按照一種計(jì)算機(jī)的機(jī)器指令編制的程序,不能在另一種計(jì)算機(jī)上執(zhí)行。因此用機(jī)器語(yǔ)言編寫程序,編程人員要首先熟記所用計(jì)算機(jī)的全部指令代碼和代碼的涵義。而且,編寫出來(lái)的程序都是0和1的指令代碼,直觀性差,容易出錯(cuò)。因此只有極少數(shù)的計(jì)算機(jī)專業(yè)人員會(huì)學(xué)習(xí)和使用機(jī)器語(yǔ)言,絕大多數(shù)的程序員不再學(xué)習(xí)機(jī)器語(yǔ)言。
匯編語(yǔ)言
盡管機(jī)器語(yǔ)言對(duì)計(jì)算機(jī)來(lái)說很好懂也很好用,但是對(duì)于編程人員來(lái)說,記住0和1的組成的指令簡(jiǎn)直就是煎熬,為了解決機(jī)器語(yǔ)言的難記憶問題,匯編語(yǔ)言誕生了,它用簡(jiǎn)潔的符號(hào)串或字母來(lái)替代不易記憶的機(jī)器語(yǔ)言,而計(jì)算機(jī)識(shí)別不了符號(hào)串,這就需要一個(gè)將 這些符號(hào)翻譯成機(jī)器語(yǔ)言的程序,把這種程序稱為匯編程序。匯編程序里一條指令只能對(duì)應(yīng)實(shí)際操作中的一個(gè)很細(xì)小的動(dòng)作,例如自增、移動(dòng),所以匯編源程序一般比較繁長(zhǎng)、易出錯(cuò),并且使用匯編語(yǔ)言編程需要有扎實(shí)的計(jì)算機(jī)知識(shí),才能編出高質(zhì)量代碼。
C語(yǔ)言
絕大數(shù)編程者喜歡高級(jí)語(yǔ)言,它簡(jiǎn)化了程序中的指令、略去了很多細(xì)節(jié),并且與計(jì)算機(jī)的硬件關(guān)系不大,更利于程序員編程。此外,高級(jí)語(yǔ)言經(jīng)歷了結(jié)構(gòu)化程序設(shè)計(jì)和面向?qū)ο蟪绦蛟O(shè)計(jì),使得程序可讀性、可靠性、可維護(hù)性都增強(qiáng)。常見的高級(jí)語(yǔ)言包括VB、C、C++、Java、C#、Python等等。
在C語(yǔ)言誕生以前,系統(tǒng)軟件主要是用匯編語(yǔ)言編寫的,由于匯編語(yǔ)言程序依賴于計(jì)算機(jī)硬件,其可讀性和可移植性都極差,一般的高級(jí)語(yǔ)言又難以實(shí)現(xiàn)對(duì)計(jì)算機(jī)硬件的直接操作(這正是匯編語(yǔ)言的優(yōu)勢(shì)),于是人們迫切希望有一種兼有匯編語(yǔ)言和高級(jí)語(yǔ)言特性的新語(yǔ)言,C語(yǔ)言就在這種需求下應(yīng)運(yùn)而生。
C語(yǔ)言的發(fā)展頗為有趣。它的原型ALGOL 60語(yǔ)言,也稱為A語(yǔ)言。
1963年,劍橋大學(xué)將ALGOL 60語(yǔ)言發(fā)展成為CPL(Combined Programming Language)語(yǔ)言。
1967年,劍橋大學(xué)的馬丁·理查茲(Matin Richards)對(duì)CPL語(yǔ)言進(jìn)行了簡(jiǎn)化,于是產(chǎn)生了BCPL語(yǔ)言。
1970年,美國(guó)貝爾實(shí)驗(yàn)室的肯·湯普森(Ken Thompson)將BCPL進(jìn)行了修改,并為它起了一個(gè)有趣的名字“B語(yǔ)言”,其含義是將CPL語(yǔ)言煮干,提煉出它的精華,并且他用B語(yǔ)言寫了第一個(gè)UNIX操作系統(tǒng)。
1973年,美國(guó)貝爾實(shí)驗(yàn)室的丹尼斯·里奇(Dennis M.Ritchie)在B語(yǔ)言的基礎(chǔ)上設(shè)計(jì)出了一種新的語(yǔ)言,他取了BCPL的第二個(gè)字母作為這種語(yǔ)言的名字,即C語(yǔ)言。
1978年,布賴恩?凱尼漢(Brian W.Kernighan)和丹尼斯·里奇(Dennis M.Ritchie)出版了名著《The C Programming Language》,從而使C語(yǔ)言成為目前世界上流傳最廣泛的高級(jí)程序設(shè)計(jì)語(yǔ)言。
早期的C語(yǔ)言主要是用于UNIX系統(tǒng),由于C語(yǔ)言的強(qiáng)大功能和各方面的優(yōu)點(diǎn)逐漸為人們認(rèn)識(shí)。到了八十年代,C開始進(jìn)入其它操作系統(tǒng),并很快在各類大、中、小和微型計(jì)算機(jī)上得到了廣泛的使用,成為當(dāng)代最優(yōu)秀的程序設(shè)計(jì)語(yǔ)言之一。
隨著微型計(jì)算機(jī)的日益普及,出現(xiàn)了許多C語(yǔ)言版本。由于沒有統(tǒng)一的標(biāo)準(zhǔn),使得這些C語(yǔ)言之間出現(xiàn)了一些不一致的地方。為了改變這種情況,美國(guó)國(guó)家標(biāo)準(zhǔn)學(xué)會(huì)(ANSI)于1989年為C語(yǔ)言制定了一套ANSI標(biāo)準(zhǔn),即C語(yǔ)言標(biāo)準(zhǔn)ANSI X3.159-1989,被稱為C89。之后在1990年,國(guó)際標(biāo)準(zhǔn)化組織ISO也接受了同樣的標(biāo)準(zhǔn)ISO9899-1990,該標(biāo)準(zhǔn)被稱為C90。這兩個(gè)標(biāo)準(zhǔn)只有細(xì)微的差別,因此,一般而言C89和C90指的是同一個(gè)C語(yǔ)言標(biāo)準(zhǔn)。在ANSI標(biāo)準(zhǔn)化發(fā)布了C89標(biāo)準(zhǔn)以后,C語(yǔ)言的標(biāo)準(zhǔn)在一段相當(dāng)?shù)臅r(shí)間內(nèi)都保持不變,直到1999年ANSI通過了C99標(biāo)準(zhǔn),C99標(biāo)準(zhǔn)相對(duì)C89做了很多修改,增加了基本數(shù)據(jù)類型、關(guān)鍵字和一些系統(tǒng)函數(shù)等,這個(gè)版本就是通常提及的C99。但由于很多編譯器仍然沒有對(duì)C99提供完整的支持,因此本書將按照C89標(biāo)準(zhǔn)來(lái)進(jìn)行講解,在適當(dāng)時(shí)會(huì)補(bǔ)充C99標(biāo)準(zhǔn)的規(guī)定和用法。
C語(yǔ)言對(duì)操作系統(tǒng)和系統(tǒng)使用程序以及需要對(duì)硬件進(jìn)行操作的場(chǎng)合,用C語(yǔ)言明顯優(yōu)于其它高級(jí)語(yǔ)言,許多大型應(yīng)用軟件都是用C語(yǔ)言編寫的。它還具有繪圖能力強(qiáng),并具備很強(qiáng)的數(shù)據(jù)處理能力,因此適于編寫系統(tǒng)軟件,三維,二維圖形和動(dòng)畫它是數(shù)值計(jì)算的高級(jí)語(yǔ)言。主要特征如下:
①簡(jiǎn)潔緊湊、靈活方便:
C語(yǔ)言一共只有32個(gè)關(guān)鍵字,9種控制語(yǔ)句,程序書寫自由,主要用小寫字母表示。它把高級(jí)語(yǔ)言的基本結(jié)構(gòu)和語(yǔ)句與低級(jí)語(yǔ)言的實(shí)用性結(jié)合起來(lái)。
②運(yùn)算符豐富:
C的運(yùn)算符包含的范圍很廣泛,共有種34個(gè)運(yùn)算符。C語(yǔ)言把括號(hào)、賦值、強(qiáng)制類型轉(zhuǎn)換等都作為運(yùn)算符處理。從而使C的運(yùn)算類型極其豐富表達(dá)式類型多樣化,靈活使用各種運(yùn)算符可以實(shí)現(xiàn)在其它高級(jí)語(yǔ)言中難以實(shí)現(xiàn)的運(yùn)算。
③數(shù)據(jù)結(jié)構(gòu)豐富:
C的數(shù)據(jù)類型有:整型、實(shí)型、字符型、數(shù)組類型、指針類型、結(jié)構(gòu)體類型、共用體類型等。能用來(lái)實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)類型的運(yùn)算。并引入了指針概念,使程序效率更高。另外C語(yǔ)言具有強(qiáng)大的圖形功能,支持多種顯示器和驅(qū)動(dòng)器。且計(jì)算功能、邏輯判斷功能強(qiáng)大。
④結(jié)構(gòu)式語(yǔ)言:
結(jié)構(gòu)式語(yǔ)言的顯著特點(diǎn)是代碼及數(shù)據(jù)的分隔化,即程序的各個(gè)部分除了必要的信息交流外彼此獨(dú)立。這種結(jié)構(gòu)化方式可使程序?qū)哟吻逦阌谑褂谩⒕S護(hù)以及調(diào)試。C語(yǔ)言是以函數(shù)形式提供給用戶的,這些函數(shù)可方便的調(diào)用,并具有多種循環(huán)、條件語(yǔ)句控制程序流向,從而使程序完全結(jié)構(gòu)化。
⑤程序設(shè)計(jì)自由:
一般的高級(jí)語(yǔ)言語(yǔ)法檢查比較嚴(yán),能夠檢查出幾乎所有的語(yǔ)法錯(cuò)誤。而C語(yǔ)言允許程序編寫者有較大的自由度。
⑥直接訪問物理地址:
C語(yǔ)言可直接訪問物理地址,可以直接對(duì)硬件進(jìn)行操作,因此C語(yǔ)言既具有高級(jí)語(yǔ)言的功能,又具有低級(jí)語(yǔ)言的許多功能,能夠象匯編語(yǔ)言一樣對(duì)位、字節(jié)和地址進(jìn)行操作,而這三者是計(jì)算機(jī)最基本的工作單元,可以用來(lái)寫系統(tǒng)軟件。
⑦程序執(zhí)行效率高:
C語(yǔ)言程序生成代碼質(zhì)量高,程序執(zhí)行效率高,一般只比匯編程序生成的目標(biāo)代碼效率低10~20%。
⑧可移植:
C語(yǔ)言有一個(gè)突出的優(yōu)點(diǎn)就是適合于多種操作系統(tǒng),如DOS、UNIX,也適用于多種機(jī)型。
主流開發(fā)環(huán)境
較早期程序設(shè)計(jì)的各個(gè)階段都要用不同的軟件來(lái)進(jìn)行處理,如先用字處理軟件編輯源程序,然后用鏈接程序進(jìn)行函數(shù)、模塊連接,再用編譯程序進(jìn)行編譯,開發(fā)者必須在幾種軟件間來(lái)回切換操作。
現(xiàn)在的編程開發(fā)軟件將編輯、編譯、調(diào)試等功能集成在一個(gè)桌面環(huán)境中,這就是集成開發(fā)環(huán)境,又稱IDE(Integrated Development EnvironMent),將它們集成在一起這樣就大大方便了用戶。
IDE為用戶使用C、C++、Java和Delphi等現(xiàn)代編程語(yǔ)言提供了方便。不同的技術(shù)體系有不同的IDE。比如Visual Studio可以稱為C、C++、VB、C#等語(yǔ)言的集成開發(fā)環(huán)境,所以Visual Studio可以叫做IDE。同樣,Borland的JBuilder也是一個(gè)IDE,它是Java的IDE。Eclipse也是一個(gè)IDE,可以用于開發(fā)Java語(yǔ)言和C++語(yǔ)言。下面將介紹幾種主流的C語(yǔ)言開發(fā)環(huán)境。
①Code::Bloocks
Code::Blocks 是一個(gè)體積小、開放源碼、免費(fèi)的跨平臺(tái)C/C++集成開發(fā)環(huán)境,它提供了大量的工程模板,支持插件,并且具有強(qiáng)大而靈活的配置功能,是目前主流的開發(fā)環(huán)境。
②Microsoft Visual Studio
Microsoft Visual Studio是美國(guó)微軟公司推出的集成開發(fā)環(huán)境。它包括整個(gè)軟件生命周期中所需要的大部分工具,如代碼管控工具、集成開發(fā)環(huán)境等,但軟件體積偏大,目前最新版本為Visual Studio 2015。
③Eclipse
Eclipse是用于Java語(yǔ)言開發(fā)的集成開發(fā)環(huán)境,現(xiàn)在Eclipse已經(jīng)可以用來(lái)開發(fā)C、C++、Python和PHP等眾多語(yǔ)言,此外,也可以安裝插件,比如CDT是Eclipse的插件,它使得Eclipse可以作為C/C++的集成開發(fā)環(huán)境。
④Vim
Vim是一個(gè)功能強(qiáng)大的文本編輯器,它是從Vi編輯器發(fā)展過來(lái)的,可以通過插件擴(kuò)展功能來(lái)達(dá)到和集成開發(fā)環(huán)境相同的效果。因此,Vim有的時(shí)候也被程序員當(dāng)做集成開發(fā)環(huán)境使用。
⑤Microsoft Visual C++6.0
Microsoft Visual C++ 6.0,簡(jiǎn)稱VC6.0,是微軟于1998年推出的一款C++編譯器,集成了MFC 6.0,包含標(biāo)準(zhǔn)版(Standard Edition)、專業(yè)版(Professional Edition)與企業(yè)版(Enterprise Edition)[2]。發(fā)行至今一直被廣泛地用于大大小小的項(xiàng)目開發(fā)。本書假設(shè)您的開發(fā)環(huán)境為Microsoft Visual C++ 6.0。
第一個(gè)C程序通過前面對(duì)C語(yǔ)言的介紹,相信大家已經(jīng)對(duì)C語(yǔ)言產(chǎn)生了濃厚的興趣,下面正式開啟C語(yǔ)言的編程之旅。為了讓初學(xué)者對(duì)學(xué)習(xí)C語(yǔ)言產(chǎn)生足夠的信心,第一個(gè)程序盡量簡(jiǎn)短。
#include
int main()
{
printf(“這是第一個(gè)C語(yǔ)言程序!n”);
return 0;
}
例子代碼實(shí)現(xiàn)了一個(gè)C程序,在屏幕上輸出“這是第一個(gè)C語(yǔ)言程序!”信息。下面對(duì)其中代碼逐行進(jìn)行詳細(xì)地解釋。
第1行:字符‘#’是預(yù)處理標(biāo)志,用來(lái)對(duì)文件進(jìn)行預(yù)處理操作。預(yù)處理標(biāo)志表示該行代碼要最先處理,所以它要在編譯器編譯代碼之前運(yùn)行。include是預(yù)處理指令。它后面跟著一對(duì)尖括號(hào),表示將尖括號(hào)中的文件在這里讀入。stdio是standard input output的縮寫形式,即“標(biāo)準(zhǔn)輸入輸出”,stdio.h就是標(biāo)準(zhǔn)輸入輸出頭文件,這個(gè)頭文件中聲明了用于輸入或輸出的函數(shù)。由于此程序中用到了輸出函數(shù)printf(),因此需要添加輸入輸出頭文件。
第2行:聲明了一個(gè)main函數(shù)(也稱主函數(shù)),其中int是函數(shù)的返回值類型,每個(gè)函數(shù)都需要注明其返回值類型,表示在函數(shù)結(jié)束后,要向操作系統(tǒng)返回的數(shù)值類型。“()”則表明是一個(gè)函數(shù)。main函數(shù)的本質(zhì)是“函數(shù)”,但它與普通函數(shù)有著本質(zhì)的區(qū)別,普通函數(shù)需要由其他函數(shù)調(diào)用或者激活,main函數(shù)則是在程序開始時(shí)自動(dòng)執(zhí)行。每個(gè)C程序都有一個(gè)main函數(shù),它是程序的入口。在上面的C程序中,main函數(shù)實(shí)現(xiàn)了屏幕上輸出“這是第一個(gè)C語(yǔ)言程序!”的功能。
第3行:左大括號(hào)“{”表示函數(shù)的開始。
第4行:使用printf函數(shù)來(lái)輸出一行信息。printf是print format的縮寫,print是打印的意思,format是格式化的意思,printf則是格式化輸出或者按格式輸出。“()”則表明printf是一個(gè)函數(shù)名,其中放置的是main函數(shù)傳遞給printf函數(shù)的信息。如上面程序中的“這是第一個(gè)C語(yǔ)言程序!”這個(gè)信息叫做參數(shù),完成的名稱為函數(shù)的實(shí)際參數(shù)。printf函數(shù)接收到main函數(shù)傳遞給它的參數(shù),然后將雙引號(hào)之間的內(nèi)容按照一定的格式輸出到屏幕上。
第5行:return關(guān)鍵字,表示返回,作用是從函數(shù)中返回,后面跟著要返回的值——0。由于該句被添加到main函數(shù)中,表示main函數(shù)向操作系統(tǒng)返回一個(gè)0值(普通函數(shù)在執(zhí)行完畢后,都會(huì)返回一個(gè)執(zhí)行結(jié)果,return
將這個(gè)執(zhí)行結(jié)果返回給操作系統(tǒng))。操作系統(tǒng)通過返回值來(lái)了解程序退出的狀態(tài),一般用0表示正常,用1表示異常。如果返回值類型為void,return后面則不用跟返回值,直接寫return即可終止函數(shù)的運(yùn)行。
第6行:右大括號(hào)“}”表示函數(shù)的結(jié)束。
在對(duì)main函數(shù)進(jìn)行聲明時(shí),可能會(huì)發(fā)現(xiàn)這樣的寫法:main(),它沒有為main函數(shù)注明返回值類型。
在C 語(yǔ)言中,凡是未注明返回值類型的函數(shù),就會(huì)被編譯器作為返回整型值處理。這個(gè)寫法在C90標(biāo)準(zhǔn)中還是勉強(qiáng)允許的,但是到了C99標(biāo)準(zhǔn)就不予通過了,因此不要這樣寫main函數(shù)。
另外,還可能會(huì)有這樣的寫法:void main()。
void作為返回值類型時(shí),則表示“無(wú)類型”,常用在對(duì)函數(shù)的參數(shù)類型、返回值、函數(shù)中的指針類型進(jìn)行聲明。由于任何函數(shù)都必須注明返回值類型,void則表示main函數(shù)沒有返回值。有些編譯器允許這種寫法,有些則不允許,因此考慮到C語(yǔ)言的移植性,要盡量采用標(biāo)準(zhǔn)寫法:int main()。
C程序運(yùn)行流程
C語(yǔ)言并不能直接被計(jì)算機(jī)所理解,需要將C語(yǔ)言轉(zhuǎn)變成可執(zhí)行代碼,即二進(jìn)制代碼。在C語(yǔ)言轉(zhuǎn)變成二進(jìn)制可執(zhí)行代碼時(shí),是以工程為單位的。而一個(gè)工程中往往會(huì)包含多個(gè)C文件。因此,需要將每個(gè)C文件都編譯成二進(jìn)制代碼。此時(shí),每個(gè)C文件所對(duì)應(yīng)的二進(jìn)制代碼是獨(dú)立的。由于工程是一個(gè)系統(tǒng),所以需要將所有的C文件二進(jìn)制代碼鏈接到一起,形成一個(gè)工程的可執(zhí)行文件。一般程序的運(yùn)行流程包括編輯、編譯、連接、運(yùn)行四個(gè)環(huán)節(jié),運(yùn)行C語(yǔ)言時(shí)也需經(jīng)過這四個(gè)環(huán)節(jié)。
編輯類似于文本編輯,將程序代碼輸入進(jìn)去,可以修改,增加,刪除。
編譯是將C代碼轉(zhuǎn)換成CPU可執(zhí)行機(jī)器指令的過程,每個(gè).c文件生成一個(gè).obj文件。
鏈接是把生成的(多個(gè)) .obj 文件及用到的庫(kù)文件(.lib)一起組合生成可執(zhí)行文件(.exe)。
運(yùn)行是指運(yùn)行鏈接環(huán)節(jié)生成的可執(zhí)行文件,得到預(yù)期結(jié)果的過程。
首先編寫好C程序,然后將每個(gè).c文件生成一個(gè).obj文件,再將生成的.obj 文件及用到的庫(kù)文件(.lib)一起組合生成可執(zhí)行文件(.exe),最后運(yùn)行達(dá)到預(yù)期的結(jié)果。
審核編輯:黃飛
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136692 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62571 -
計(jì)算機(jī)語(yǔ)言
+關(guān)注
關(guān)注
1文章
15瀏覽量
9381
原文標(biāo)題:如何學(xué)習(xí)C語(yǔ)言?
文章出處:【微信號(hào):?jiǎn)纹瑱C(jī)與嵌入式,微信公眾號(hào):?jiǎn)纹瑱C(jī)與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論