相對于其他語言來說,,C語言的關(guān)鍵字算是少的了。在C98中關(guān)鍵子總共只有32個,,我們來分析一下每個關(guān)鍵字在C語言中它獨特的作用,。 1、關(guān)于數(shù)據(jù)類型的關(guān)鍵字 (1) char :聲明字符型變量或函數(shù) enum類型可以增加可讀性,,可移植性,;在enum中定義的每個對象,默認(rèn)都是從0開始,,當(dāng)然也可以自定義,。如下: enum Color{RED,BLACK,WHITE}; Color中RED=0,BLACK=1,,WHITE=2; Number中ONE=1,,TWO=2,THREE=3,; (4) float:聲明浮點型變量或函數(shù) 結(jié)構(gòu)體struct的作用已經(jīng)在上一篇博文中講到,,可以用來實現(xiàn)C語言的封裝,繼承,,多態(tài)等等,。 請參考http://www.cnblogs.com/whc-uestc/p/4677414.html union類型可以用來提高內(nèi)存的使用率,如下:
return 0; 復(fù)制代碼 如果不使用union,,我們需要分別定義int,float,cahr*,,需要占用12字節(jié)的內(nèi)存空間,但是當(dāng)我們使用union時,,只需要占用4字節(jié)即可,;但是需要注意的時,我們在上面那個代碼中執(zhí)行語句2或者3中需要用到int a時,,就無法使用union了,,必須單獨定義int a;否則讀出的a值將會錯誤的。 (11) unsigned:聲明無符號類型變量或函數(shù) 2,、關(guān)于控制語句的關(guān)鍵字 循環(huán)語句 (13) for:一種循環(huán)語句(可意會不可言傳) 條件判斷語句 (16)if: 條件語句 在case...switch語句中,,當(dāng)一個條件輸入,,從滿足條件的那個case語句開始執(zhí)行,直到遇到跳轉(zhuǎn)指令(break;return;goto;contine;),,所以建議在每條case語句后面加上break,,除非你是刻意不那么做的,。 跳轉(zhuǎn)語句 (21)goto:無條件跳轉(zhuǎn)語句 用goto語句可以保證程序存在唯一的出口,避免了過于龐大的if嵌套,,但是隨意使用goto語句就會對程序帶來很大的隱患(可能會跳過變量的初始化,、重要的計算語句等),影響代碼的健壯性和可讀性,。所以不推薦過多地使用,。 (22) continue:結(jié)束當(dāng)前循環(huán),開始下一輪循環(huán) (23) break:跳出當(dāng)前循環(huán) (24)return :子程序返回語句(可以帶參數(shù),,也可以不帶參數(shù)) 在return語句之后函數(shù)中的所有指令都不會執(zhí)行,,所以需要確保在return語句之前執(zhí)行完必要的指令。 3,、關(guān)于存儲類型的關(guān)鍵字 (25)auto :聲明自動變量 一般不使用,,因為當(dāng)我們聲明一個局部變量是默認(rèn)就是auto a,、當(dāng)我們把一個全局變量聲明為static時:只有它的作用范圍變?yōu)楸驹次募?,也就是屬性由external變?yōu)閕nternal,其它不變,; b,、當(dāng)我們把函數(shù)聲明為static時:它的作用范圍變?yōu)楸驹次募簿褪菍傩杂蒭xternal變?yōu)閕nternal,; c,、當(dāng)我們把局部變量聲明為static時:默認(rèn)初始化值為0,并且只在第一次定義時初始化,;內(nèi)存存儲區(qū)域不再是棧,,而是在靜態(tài)存儲區(qū);生命周期不再是所在函數(shù),,而是整個進程,;其它不變。 4,、其它一些關(guān)鍵字 (29)const :聲明只讀變量 由const聲明的變量,,必須在定義時進行初始化,。如下: const int num = 10;//在定義處初始化,并且變量的值不允許再改變 既然變量的值都不允許改變,,那么這個變量定義了有啥用,?哈哈,用處大著呢,。首先在我們定義數(shù)組的時候,,數(shù)組的大小就可以用const定義的常量來表示,這個就跟#define一樣,,但是它是類型安全的,,#define是預(yù)處理命令,只是進行簡單的字符替換,,而編譯器會對const定義的變量進行類型檢查,;其次,當(dāng)我們需要一個不再改變的變量時,,就可以用const,,比如說定義一個人的性別,自打你一出生就已經(jīng)決定了你的性別,,不出意外的話,,這輩子都不會改變了,所以就把它定義為只讀的,,當(dāng)然有人也認(rèn)為不定義為const也可以的嘛,,只要自己不改變它就行,但是如果是那樣的話,,就需要人為來控制了,,萬一哪天忘了,把它改了怎么辦,?所以對于一些只讀或者常量最好用const來定義,。 當(dāng)我們把const與指針變量放在一起的時候,問題就變得復(fù)雜了,。比如我們定義如下: const int *p1; 指針變量p1:const在數(shù)據(jù)類型之前,,修飾的是p1所指向的對象,所以p1所指向的對象的值為常量只讀,,不能改變,,但是p1本身可以改變; 指針變量p2:const在*之前,,這種情況與p1相同,; 指針變量p3:const在*之后,修飾的是變量p3,所以變量p3本身為常量只讀,,而p3所指向的對象可以改變; 指針變量p4:有兩個const分別修飾變量p4和p4所指向的對象,,所以p4本身和p4所指向的對象都為常量只讀,,都不可以改變。 其實這些也很容易記住,,只要看const是在*前還是在*后面,,在*前修飾的就是指針?biāo)赶虻膶ο螅?后,,修飾的就是指針本身,。 下面來舉個簡單的例子說明:
復(fù)制代碼 在上面代碼中,error(1)和error(2)很容易理解,,因為const在*之后,,所以指針p3,p4本身為只讀,在定義時必須初始化,。error(3)是因為對于p1指針,,const在*之前,所以p1所指向的對象不能改變,。error(4)和error(5)是因為對于p3,p4,,有const在*之后,所以指針本身只讀,,在初始化之后,,就無法再改變了。 (30)sizeof:計算數(shù)據(jù)類型長度 很多人不理解sizeof與strlen的區(qū)別:sizeof是運算符,,而strlen是函數(shù),;sizeof計算的是數(shù)據(jù)類型的大小,而strlen計算的是字符串的長度,;sizeof的參數(shù)既可以是數(shù)據(jù)類型,,也可以是變量,而strlen的參數(shù)只能是char*,而且必須是空字符結(jié)尾,;sizeof返回值類型為unsigned,,而strlen返回值為signed,因為它需要返回負(fù)數(shù)來表示出錯情況,。 (31)typedef:用以給數(shù)據(jù)類型取別名 typedef在程序設(shè)計里面很有用,,當(dāng)一個數(shù)據(jù)類型很長時(比如說函數(shù)指針),我們就可以用typedef來選用一個很合適的名字來替代它,;當(dāng)我們使用int,float,double這些類型時,,也可以使用自己喜歡并且直觀的名字來重新定義它,這樣,,當(dāng)我們以后需要把項目中的float類型換成double類型的時候,,我們就可以直接在typedef上把float換成double就可以,,而不需要把所有代碼里面每個float換成double。 volatile 修飾的變量不允許編譯器對與它有關(guān)的運算做任何優(yōu)化,;用volatile定義的變量可能會在程序外被改變,,所以每次都必須從內(nèi)存中讀取,而不能把他放在cache或寄存器中重復(fù)使用,。一般用在以下幾個地方: a,、并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器) 以上結(jié)論只是個人的見解與建議,,如果上述所說有誤或者大家有不同的見解,歡迎指正與討論,。 本文永久更新鏈接地址:http://www./Linux/2015-08/121240.htm |
|