C語言兼有高級語言和低級語言的特點
廣泛應用于操作系統(tǒng)和應用軟件的編寫以及單片機和嵌入式系統(tǒng)的開發(fā)
C語言的產(chǎn)生
1963年,劍橋大學推出了CPL(Combined Programming Langurage)語言.
1967年,劍橋大學的Matin Richards對CPL語言做了簡化,推出了BCPL(Base Combined Programming Langurage)語言
1969年前后,貝爾實驗室的肯.蘭.湯普森(Ken Lane Thompson)在丹尼斯.麥卡斯利泰爾.里奇(Dennis MacAlistair Ritchie/DMR)的支持下,以BCPL為基礎,對BCPL語言簡化,設計出了很簡單的而且很接近硬件的B語言(取BCPL的第一個字母),用來編寫UNIX.
但B語言過于簡單,功能有限.
1972年,DMR在B語言的基礎上設計出了C語言,(取BCPL的第二個字母).C語言問世.
C語言保持了BCPL語言和B語言的優(yōu)點(精練,接近硬件),又克服了他們的缺點(過于簡單,數(shù)據(jù)無類型等)
1973年初,C語言的主體完成,Thompson和Ritchie開始用C語言重寫UNIX
1977年,DMR發(fā)表了不依賴于具體機器系統(tǒng)的C語言編譯文本<<可移植的C語言編譯程序>>
1978年,美國電話電報公司AT&T(American Telephone & Telegraph)貝爾實驗室正式發(fā)布C語言.同年布萊恩.威爾森.柯林漢(Brian Wilson Kernaghan)和丹尼斯.麥卡斯利泰爾.里奇(Dennis MacAlistair Ritchie)合著了<<The C Programming Language>>一書,這本書被C語言開發(fā)者稱為K&R,很多年來被開發(fā)者當做C語言的非正式標準說明.人們稱這個版本的C語言為K&R C
C語言的標準
K&R C
起初,C語言沒有官方標準.
1978年由美國電話電報公司(AT&T)的貝爾實驗室正式發(fā)表C語言.
同年布萊恩·柯林漢(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)出版了一書<<The C Programming Language>>.
這本書被C語言開發(fā)者們稱為K&R,很多年來被當作C語言的非正式的標準說明.人們稱這個版本的C語言為K&R C
ANSI C/C89
1989年,為了避免個開發(fā)廠商用的C語言語法產(chǎn)生差異以及C語言能夠健康發(fā)展下去,美國國家標準協(xié)會(American National Standards Institute/ANSI)通過了C語言標準.
因為這個標準是1989年通過的,所以簡稱C89標準.有些人也簡稱ANSI C,因為這個標準是美國國家標準協(xié)會(ANSI)發(fā)布的.
注:
ISO C/C90
1990年,國際標準化組織(International Organization for Standardization/ISO)和國際電工委員會(International Electrotechnical Commission/IEC)把C89標準定一字不改的采納為C語言的國際標準.
因為此標準是在1990年發(fā)布的,所以簡稱作C90標準.
不過大多數(shù)人依然稱之為C89標準,因為此標準與ANSI C/C89標準完全等同.
ANSI C/C89和ISO C/C90內容基本相同,主要是發(fā)布的組織和時間不同.
C99
ANSI C標準確立之后,C語言的標準在很長一段時間內都沒有較大的變動(出現(xiàn)過修訂版本C94 和 C95).
1999年1月,國際標準化組織(ISO)和國際電工委員會(IEC)發(fā)布了C語言的新標準C99.這是C語言的第二個官方標準.
C11
2011年12月8日,國際標準化組織(ISO)和國際電工委員會(IEC)再次發(fā)布了C語言的新標準C11,原名C1X.這是C語言的第三個官方標準,也是C語言的最新標準.
C語言特點
基本特性
高級語言
把高級語言的基本結構和語句與低級語言的實用性結合起來.結構式語言
結構式語言的顯著特點是代碼及數(shù)據(jù)的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立.這種結構化方式可使程序層次清晰,便于使用,維護以及調試.具有多種循環(huán),條件語句控制程序流向,從而使程序完全結構化.代碼級別的跨平臺
由于標準的存在,使得幾乎同樣的C代碼可用于多種操作系統(tǒng),如Windows,DOS,UNIX等等,也適用于多種機型.
C語言對編寫需要進行硬件操作的場合,優(yōu)于其它高級語言使用指針
可以直接進行靠近硬件的操作,但是C的指針操作不做保護,也給它帶來了很多不安全的因素.
C++在這方面做了改進,在保留了指針操作的同時又增強了安全性,受到了一些用戶的支持,但是,由于這些改進增加語言的復雜度,也為另一部分所詬病.
Java則吸取了C++的教訓,取消了指針操作,也取消了C++改進中一些備受爭議的地方,在安全性和適合性方面均取得良好的效果,但其本身解釋在虛擬機中運行,運行效率低于C++/C.一般而言,C,C++,java被視為同一系的語言,它們長期占據(jù)著程序使用榜的前三名.
特有特點
- C語言是一個有結構化程序設計,具有變量作用域以及遞歸功能的過程式語言
- C語言傳遞參數(shù)均是以值傳遞(pass by value),另外也可以傳遞指針(a pointer passed by value).
- 不同的變量類型可以用結構體組合在一起
- 只有32個保留字,使變量,函數(shù)命名有更多彈性
- 部份的變量類型可以轉換,例如整型和字符型變量.
- 通過指針(pointer)C語言可以容易的對存儲器進行控制
- 編譯預處理讓C語言的編譯更具有彈性
優(yōu)點
簡潔緊湊,靈活方便
C語言一共只有32個關鍵字,9種控制語句,程序書寫形式自由,區(qū)分大小寫.
把高級語言的基本結構和語句與低級語言的實用性結合起來.
C語言可以像匯編語言一樣對位,字節(jié)和地址進行操作,而這三者是計算機最基本的工作單元.運算符豐富
C語言的運算符包含的范圍很廣泛,共有34種運算符.C語言把括號,賦值,強制類型轉換等都作為運算符處理.從而使C語言的運算類型極其豐富,表達式類型多樣化.
靈活使用各種運算符可以實現(xiàn)在其它高級語言中難以實現(xiàn)的運算數(shù)據(jù)類型豐富
C語言的數(shù)據(jù)類型有:整型,實型,字符型,數(shù)組類型,指針類型,結構體類型,共用體類型等.能用來實現(xiàn)各種復雜的數(shù)據(jù)結構的運算.
并引入了指針概念,使程序效率更高.表達方式靈活實用
C語言提供多種運算符和表達式值的方法,對問題的表達可通過多種途徑獲得,其程序設計更主動,靈活.
它語法限制不太嚴格,程序設計自由度大,如對整型量與字符型數(shù)據(jù)及邏輯型數(shù)據(jù)可以通用等.允許直接訪問物理地址彼硫,對硬件進行操作
由于C語言允許直接訪問物理地址,可以直接對硬件進行操作,因此它既具有高級語言的功能,又具有低級語言的許多功能,能夠像匯編語言一樣對位(bit),字節(jié)和地址進行操作,而這三者是計算機最基本的工作單元,可用來寫系統(tǒng)軟件.生成目標代碼質量高,程序執(zhí)行效率高
C語言描述問題比匯編語言迅速,工作量小,可讀性好,易于調試,修改和移植.而代碼質量與匯編語言相當.
C語言程序生成的目標代碼效率接近于匯編程序可移植性好
C語言在不同機器上的C編譯程序,代碼幾乎是公共的,所以C語言的編譯程序便于移植.
在一個環(huán)境上用C語言編寫的程序,不改動或稍加改動,就可移植到另一個完全不同的環(huán)境中運行表達力強
C語言有豐富的數(shù)據(jù)結構和運算符.
包含了各種數(shù)據(jù)結構,如整型,數(shù)組類,绎狭、指針類型和聯(lián)合類型等,用來實現(xiàn)各種數(shù)據(jù)結構的運算.
C語言的運算符有34種,范圍很寬,靈活使用各種運算符可以實現(xiàn)難度極大的運算.
C語言能直接訪問硬件的物理地址,能進行位操作.兼有高級語言和低級語言的許多優(yōu)點
C語言既可用來編寫系統(tǒng)軟件,又可用來開發(fā)應用軟件,已成為一種通用程序設計語言.
C語言具有強大的圖形功能,支持多種顯示器和驅動器.且計算功能,邏輯判斷功能強大.
缺點
**C語言的缺點主要表現(xiàn)在數(shù)據(jù)的封裝性上,這一點使得C在數(shù)據(jù)的安全性上有很大缺陷,這也是C和C++的一大區(qū)別. **
**C語言的語法限制不太嚴格,對變量的類型約束不嚴格,影響程序的安全性,對數(shù)組下標越界不作檢查等.從應用的角度,C語言比其他高級語言較難掌握.也就是說,對用C語言的人,要求對程序設計更熟練一些. **
語言組成
基本構成
數(shù)據(jù)類型
C語言的數(shù)據(jù)類型包括: **C整型,字符型,實型或浮點型(單精度和雙精度),枚舉類型,數(shù)組類型,結構體類型,共用體類型,指針類型和空類型. **常量與變量
常量其值不可改變,符號常量名通常用大寫.
變量是以某標識符為名字,其值可以改變的量.標識符是以字母或下劃線開頭的一串由字母,數(shù)字或下劃線構成的序列,請注意第一個字符必須為字母或下劃線,否則為不合法的變量名.變量在編譯時為其分配相應存儲單元.數(shù)組
如果一個變量名后面跟著一個有數(shù)字的中括號,這個聲明就是數(shù)組聲明.字符串也是一種數(shù)組.要特別注意的是,方括內的索引值是從0算起的.指針
如果一個變量聲明時在前面使用*,表明這是個指針型變量.換句話說,該變量存儲一個地址.
C語言中有取地址運算符&,可以獲取某變量在內存中的地址
C語言中有指向運算符*,可以獲取某內存地址里存儲的內容.
指針是C語言區(qū)別于其他同時代高級語言的主要特征之一.
指針不僅可以是變量的地址,還可以是數(shù)組,數(shù)組元素,函數(shù)的地址.
通過指針作為形式參數(shù)可以在函數(shù)的調用過程得到一個以上的返回值,不同于return僅能得到一個返回值.
指針是一把雙刃劍,許多操作可以通過指針自然的表達,但是不正確的或者過分的使用指針又會給程序帶來大量潛在的錯誤.字符串
C語言的字符串其實就是以'\0'字符結尾的char型數(shù)組,使用字符型并不需要引用庫,但是使用字符串就需要C標準庫里面的一些用于對字符串進行操作的函數(shù).它們不同于字符數(shù)組.使用這些函數(shù)需要引用頭文件<string.h>.輸入/輸出
在C語言中,輸入和輸出是經(jīng)由標準庫中的一組函數(shù)來實現(xiàn)的.在ANSI C中,這些函數(shù)被定義在頭文件<stdio.h>.運算
C語言的運算非常靈活,功能十分豐富,運算種類遠多于其它程序設計語言.在表達式方面較其它程序語言更為簡潔,如自加,自減,逗號運算和三目運算使表達式更為簡單.但初學者往往會覺的這種表達式難讀,關鍵原因就是對運算符和運算順序理解不透不全.當多種不同運算組成一個運算表達式,即一個運算式中出現(xiàn)多種運算符時,運算的優(yōu)先順序和結合規(guī)則顯得十分重要.在學習中,對此合理進行分類,找出它們與數(shù)學中所學到運算之間的不同點之后,記住這些運算也就不困難了,有些運算符在理解后更會牢記心中,將來用起來得心應手,而有些可暫時放棄不記,等用到時再記不遲.
先要明確運算符按優(yōu)先級不同分類,運算符可分為15種優(yōu)先級,從高到低,優(yōu)先級為1 ~ 15.
關鍵字
關鍵字又稱為保留字,就是已被C語言本身使用,不能作其它用途使用的字.例如關鍵字不能用作變量名,函數(shù)名等標識符
由ANSI標準定義的C語言關鍵字共32個:
基本數(shù)據(jù)類型關鍵字
void char int float double
類型修飾符關鍵字
short long signed unsigned
復雜類型關鍵字
struct union enum typedef
存儲類型關鍵字
auto static register extern const volatile
跳轉結構關鍵字
return continue break goto
選擇結構關鍵字
if else switch case default
循環(huán)結構關鍵字
for do while
判斷數(shù)據(jù)類型占用字節(jié)數(shù)關鍵字
sizeof
基本數(shù)據(jù)類型關鍵字
void:聲明函數(shù)無返回值或無參數(shù),聲明無類型指針,顯式丟棄運算結果(C89新增)
char:字符型類型數(shù)據(jù),屬于整型數(shù)據(jù)的一種(K&R引入)
int:整型數(shù)據(jù)(K&R時期引入)
float:單精度浮點型數(shù)據(jù),屬于浮點數(shù)據(jù)的一種(K&R引入)
double:雙精度浮點型數(shù)據(jù),屬于浮點數(shù)據(jù)的一種(K&R引入)類型修飾符關鍵字
short:修飾int,短整型數(shù)據(jù),可省略被修飾的int(K&R引入)
long:修飾int,長整型數(shù)據(jù),可省略被修飾的int(K&R引入)
signed:修飾int,有符號數(shù)據(jù)類型(C89新增)
unsigned:修飾int,無符號數(shù)據(jù)類型(K&R引入)復雜類型關鍵字
struct:結構體聲明(K&R引入)
union:聯(lián)合體聲明(K&R引入)
enum:枚舉聲明(C89新增)
typedef:聲明類型別名(K&R引入)存儲類型關鍵字
auto:指定為自動變量,由編譯器自動分配及釋放,通常在棧上分配.與static相反.當變量未指定時默認為auto(K&R引入)
static:指定為靜態(tài)變量,分配在靜態(tài)變量區(qū),修飾函數(shù)時指定函數(shù)作用域為文件內部(K&R引入)
register:指定為寄存器變量,建議編譯器將變量存儲到寄存器中使用,也可以修飾函數(shù)形參,建議編譯器通過寄存器而不是堆棧傳遞參數(shù).(K&R引入)
extern:指定對應變量為外部變量,即標示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時在其他模塊中尋找其定義.(K&R引入)
const:指定變量不可被當前線程改變(但有可能被系統(tǒng)或其他線程改變)(C89新增)
volatile:指定變量的值有可能會被系統(tǒng)或其他線程改變,強制編譯器每次從內存中取得該變量的值,阻止編譯器把該變量優(yōu)化成寄存器變量.(C89新增)跳轉結構關鍵字
return:用在函數(shù)體中,返回特定值(K&R引入)
continue:結束當前循環(huán)雪隧,開始下一輪循環(huán)(K&R引入)
break:跳出當前循環(huán)或switch結構(K&R引入)
goto:無條件跳轉語句(K&R引入)選擇結構關鍵字
if:條件語句(K&R引入)
else:if語句的否定分支,與if連用.(K&R引入)
switch:分支語句.(K&R引入)
case:分支語句中的分支標記,與switch連用.(K&R引入)
default:分支語句中的''其他'分支,可選.(K&R引入)sizeof:得到特定類型或特定類型變量占用字節(jié)大小(K&R引入)
語法結構
順序結構
順序結構的程序設計是最簡單的,只要按照解決問題的順序寫出相應的語句就行,它的執(zhí)行順序是自上而下,依次執(zhí)行.
大多數(shù)情況下順序結構都是作為程序的一部分,與其它結構一起構成一個復雜的程序選擇結構
順序結構的程序雖然能解決計算,輸出等問題,但不能做判斷再選擇.對于要先做判斷再選擇的問題就要使用選擇結構.選擇結構的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴格按照語句出現(xiàn)的物理順序.選擇結構的程序設計方法的關鍵在于構造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當?shù)倪x擇語句,選擇結構適合于帶有邏輯或關系比較等條件判斷的計算,設計這類程序時往往都要先繪制其程序流程圖,然后根據(jù)程序流程寫出源程序,這樣做把程序設計分析與語言分開,使得問題簡單化,易于理解.循環(huán)結構
循環(huán)結構可以減少源程序重復書寫的工作量,用來描述重復執(zhí)行某段算法的問題,這是程序設計中最能發(fā)揮計算機特長的程序結構,C語言中提供四種循環(huán),即goto循環(huán),while循環(huán),do while循環(huán)和for循環(huán).四種循環(huán)可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環(huán),因為強制改變程序的順序經(jīng)常會給程序的運行帶來不可預料的錯誤.
特別要注意在循環(huán)體內應包含趨于結束的語句(即循環(huán)變量值的改變),否則就可能成了一個死循環(huán).
三個循環(huán)的異同點:用while和do…while循環(huán)時,循環(huán)變量的初始化的操作應在循環(huán)體之前,而for循環(huán)一般在語句1中進行的;while循環(huán)和for循環(huán)都是先判斷表達式,后執(zhí)行循環(huán)體,而do…while循環(huán)是先執(zhí)行循環(huán)體后判斷表達式,也就是說do…while的循環(huán)體最少被執(zhí)行一次,而while循環(huán)和for就可能一次都不執(zhí)行.另外還要注意的是這三種循環(huán)都可以用break語句跳出循環(huán),用continue語句結束本次循環(huán),而goto語句與if構成的循環(huán),是不能用break和continue語句進行控制的.
順序結構,分支結構和循環(huán)結構并不彼此孤立的,在循環(huán)中可以有分支、順序結構,分支中也可以有循環(huán),順序結構,其實不管哪種結構,均可廣義的把它們看成一個語句.在實際編程過程中常將這三種結構相互結合以實現(xiàn)各種算法,設計出相應程序,但是要編程的問題較大,編寫出的程序就往往很長,結構重復多,造成可讀性差,難以理解,解決這個問題的方法是將C程序設計成模塊化結構.
程序結構
C語言的模塊化程序結構用函數(shù)來實現(xiàn),即將復雜的C程序分為若干模塊,每個模塊都編寫成一個C函數(shù),然后通過主函數(shù)調用函數(shù)及函數(shù)調用函數(shù)來實現(xiàn)一大型問題的C程序編寫
因此常說:C程序=主函數(shù)+子函數(shù).
對函數(shù)的定義調用,值的返回等中要尤其注重理解和應用
選擇結構
if語句
switch語句循環(huán)結構
while語句
do-while語句
for語句跳轉語句
goto語句
break語句
continue語句
return語句
函數(shù)
函數(shù)是一個自我包含的完成一定相關功能的執(zhí)行代碼段.
一個C程序中必須至少有一個函數(shù),而且其中必須有一個并且僅有一個以main為名,這個函數(shù)稱為主函數(shù).整個程序從這個主函數(shù)開始執(zhí)行.
C 語言程序鼓勵和提倡把一個大問題劃分成一個個子問題,對應于解決一個子問題編制一個函數(shù),因此C語言程序一般是由大量的小函數(shù)而不是由少量大函數(shù)構成的,即所謂"小函數(shù)構成大程序".
這樣的好處是讓各部分相互充分獨立,并且任務單一.因而這些充分獨立的小模塊也可以作為一種固定規(guī)格的小"構件",用來構成新的大程序.
C語言在發(fā)展的同時也積累了很多能直接使用的庫函數(shù).
ANSI C提供了標準C語言庫函數(shù).
C語言初學者比較喜歡的Turbo C 2.0提供了400多個運行時函數(shù),每個函數(shù)都完成特定的功能,用戶可隨意調用.這些函數(shù)總體分成輸入輸出函數(shù),數(shù)學函數(shù),字符串和內存函數(shù).與BIOS和DOS有關的函數(shù),字符屏幕和圖形功能函數(shù),過程控制函數(shù),目錄函數(shù)等.
Windows系統(tǒng)所提供的Windows SDK中包含了數(shù)千個跟Windows應用程序開發(fā)相關的函數(shù).
其他操作系統(tǒng),如Linux,也同樣提供了大量的函數(shù)讓應用程序開發(fā)人員調用.
作為程序員應盡量熟悉目標平臺庫函數(shù)其功能.這樣才能游刃有余地開發(fā)特定平臺的應用程序.比如作為Windows應用程序的開發(fā)者桐磁,應盡量熟悉Windows SDK;作為Linux應用程序開發(fā)者,應盡量熟悉Linux系統(tǒng)調用和POSIX函數(shù)規(guī)范.
運算符
注:
- 一個C程序可以由一個或多個文件組成.
- 每個文件可由一個或多個函數(shù)組成
- 一個程序不論由多少個文件組成,都有一個且只能有一個main函數(shù),即主函數(shù).main函數(shù)是整個程序的入口.
- 源程序中可以有預處理命令
- 每一個聲明,每一個語句都必須以分號結尾.(結構體,聯(lián)合體,枚舉型的聲明的"}"后要加分號.
但預處理命令,函數(shù)頭和復合語句的"}"之后不能加分號.