C语言——关键字
C語言——關(guān)鍵字
宗旨:技術(shù)的學(xué)習(xí)是有限的,分享的精神是無限的。
【謹(jǐn)記:盡量不要用printf函數(shù),要去看變量的值,內(nèi)存的值。】
?auto,int,double,long,char,float,short,signed,unsigned,struct,union,enum,static,switch,case,default,break,register,const,volatile,typedef,extern,return,void,continue,do,while,if,else,for,goto,sizeof。
【定義和聲明:定義創(chuàng)建了對(duì)象并為這個(gè)對(duì)象分配了內(nèi)存,聲明沒有分配內(nèi)存。】?
auto????????????????//聲明自動(dòng)變量,缺省時(shí)編譯器一般默認(rèn)為auto
int?????????????????//聲明整型變量?
double?????????????//聲明雙精度變量
long???????????????//聲明長整型變量?
char???????????????//聲明字符變量
float???????????????//聲明浮點(diǎn)型變量?
short???????????????//聲明短整型變量
signed?????????????//聲明有符號(hào)類型變量
unsigned???????????//聲明無符號(hào)類型變量?
struct??????????????//聲明結(jié)構(gòu)體變量
union??????????????//聲明聯(lián)合類型數(shù)據(jù)
enum??????????????//聲明枚舉類型
static??????????????//聲明靜態(tài)變量???
switch?????????????//用于開關(guān)語句???
case??????????????//開關(guān)語句分支
default????????????//開關(guān)語句中的其他分支?
break?????????????//跳出當(dāng)前循環(huán)
register???????????//聲明寄存器變量?
const?????????????//聲明只讀變量???
volatile???????????//說明變量在程序執(zhí)行中可被隱含地改變
typedef???????????//用以給數(shù)據(jù)類型取別名
extern????????????//聲明變量是在其他文件正聲明(也可以看做是引用變量)
return????????????//子程序返回語句(可以帶參數(shù),也可不帶參數(shù))
void?????????????//聲明函數(shù)無返回值或無參數(shù),聲明空類型指針
continue?????????//結(jié)束當(dāng)前循環(huán),開始下一輪循環(huán)??
do??????????????//循環(huán)語句的循環(huán)體??
while????????????//循環(huán)語句的循環(huán)條件
if???????????????//條件語句
else?????????????//條件語句否定分支(與if連用)?
for??????????????//一種循環(huán)語句
goto????????????//無條件跳轉(zhuǎn)語句,盡量少用或者不用
sizeof???????????//計(jì)算對(duì)象所占內(nèi)存空間大小,這不是個(gè)函數(shù)???
我在這兒只說一些比較常用而且比較重要的關(guān)鍵字
?
1. register:
請(qǐng)求編譯器盡可能的將變量存到CPU內(nèi)部寄存器中而不是通過內(nèi)存尋址訪問以提高效率。。對(duì)這種變量不可以使用取址運(yùn)算符來獲取其地址,因?yàn)樗辉賰?nèi)存中。寄存器變量用的不算多,但是還是得知道是什么意思。?
2. static:---?修飾變量和函數(shù)(限定作用域)
1.修飾變量
//變量又分為局部和全局變量,但它們都存在于內(nèi)存的靜態(tài)區(qū)。
//靜態(tài)全局變量,作用域僅限于變量被定義的文件中,其他文件即使用extern聲明也沒法使用。
準(zhǔn)確地說作用域是從定義之處開始,到文件結(jié)尾處結(jié)束,在定義之處前面的代碼行也不可以使用。
//靜態(tài)局部變量,在函數(shù)體里面定義的,就只能在這個(gè)函數(shù)里用,同一個(gè)文檔中的其他函數(shù)也用不了。
由于被static修飾的變量松獅存在內(nèi)存的靜態(tài)區(qū),所以即使這個(gè)函數(shù)運(yùn)行結(jié)束,
這個(gè)靜態(tài)變量的值還是不會(huì)被銷毀,函數(shù)下次使用時(shí)仍然能用。
2.修飾函數(shù)
//函數(shù)前加static使得函數(shù)成為靜態(tài)函數(shù)。
但此處static的含義不是指存儲(chǔ)方式,而使指對(duì)函數(shù)的作用域僅局限于本文件(所以又稱內(nèi)部函數(shù))。
使用內(nèi)部函數(shù)的好處是:不同的人編寫不同的函數(shù)時(shí),不用擔(dān)心自己定義的函數(shù),是否會(huì)與其他文件的函數(shù)同名。
//在C中引入關(guān)鍵字static是為了表示退出一個(gè)塊后仍然存在的局部變量。
//隨后,static在C中有了第二種含義:用來表示不能被其他文件訪問的全局變量和函數(shù)。
為了避免引入新的關(guān)鍵字,所以仍然使用static關(guān)鍵字來表示這第二種含義。
?
3. 基本數(shù)據(jù)類型:short、long、int、char、float、double(共6種)
構(gòu)造數(shù)據(jù)類型:數(shù)組、結(jié)構(gòu)體struct、公用體union、枚舉類型enum
空類型void
【short為2個(gè)字節(jié),int為4個(gè)字節(jié),long為4個(gè)字節(jié),float為4個(gè)字節(jié)、
?double為8個(gè)字節(jié),char為1個(gè)字節(jié)(一般情況下)】
【隱式類型轉(zhuǎn)換:short,char → int →unsigned??int → long → double(主干道)?←float】
?
4. sizeof關(guān)鍵字:計(jì)算變量所占空間?–?數(shù)組做函數(shù)參數(shù)時(shí),退化為指針,4字節(jié)
??sizeof?(int)*p??-----??sizeof(int) * p = 4p
??再次強(qiáng)調(diào),sizeof不是函數(shù),而是關(guān)鍵字。
?
5. signed和unsigned關(guān)鍵字:
//32位的signedint類型整數(shù)其值表示范圍為:-2^31~2^31-1
//8位的signed char類型其值表示范圍為:-2^7~2^7-1
//32位的unsigned int類型整數(shù)其值表示范圍為:0~2^32-1
//8位的unsigned char類型其值表示范圍為:0~2^8-1
??在計(jì)算機(jī)中,數(shù)值是以補(bǔ)碼的形式存儲(chǔ):使用補(bǔ)碼,可以將符號(hào)位與其他位統(tǒng)一處理,同時(shí)減法也可以按加法處理。
?
6. if和else關(guān)鍵字:
寫if語句時(shí),一般情況下先處理正常情況再處理異常情況,以便提高效率,可讀性也較好;bool一般初始化為false比較好;int,float,指針變量?與0的比較問題(整形可以直接與0比較;float是實(shí)型,不能精確到0;指針變量與NULL)
if(flag) --- bool
if(0 == i) --- int
if(i > -0.000001 && i <0.000001)??--- float
if(NULL == p) ---?指針變量
?
7. switch/case關(guān)鍵字:【解決多分支的問題】
??每個(gè)case語句結(jié)尾加break;最后必須使用default分支。
case后面只能是整形或者字符型的常量或常量表達(dá)式。
?
8. do/while/for關(guān)鍵字:(3種循環(huán)結(jié)構(gòu))
while:先判斷while后面括號(hào)里的值,如果為真則執(zhí)行其后面的代碼;否則不執(zhí)行
do-while:先執(zhí)行do后面的代碼,然后再判斷while后面括號(hào)里的值,如果為真,循環(huán)開始;否則,循環(huán)不開始。用法和while沒有區(qū)別,但相對(duì)較少用。---??至少執(zhí)行一次
for:可以很容易的控制循環(huán)次數(shù),多用于事先知道循環(huán)次數(shù)的情況。
【多重循環(huán)時(shí),最長的循環(huán)放在最內(nèi)層,最短的放在最外層,以提高執(zhí)行效率;循環(huán)不要超過3層嵌套】
?
9. break終止本層循環(huán);continue終止本次循環(huán),開始下一次循環(huán);return終止函數(shù)。
?
10. void關(guān)鍵字:“空即是色”---?很強(qiáng)大
?---?函數(shù)返回值的限定;函數(shù)參數(shù)的限定。
任何指針類型都可以直接賦給void *類型,反過來就不行;不能定義一個(gè)void變量。
//void *memcpy(void *dest, const void *src, size_tlen);
//void *memset(void *buffer, int c, size_t num);
能說的比較少,但是void關(guān)鍵字真的是很強(qiáng)大,這點(diǎn)毋庸置疑。
?
11. return關(guān)鍵字:
??---?終止一個(gè)函數(shù)并返回其后跟的值
??【別返回棧內(nèi)存的的指針,因?yàn)樵搩?nèi)存在函數(shù)體結(jié)束時(shí)被自動(dòng)銷毀,會(huì)導(dǎo)致程序錯(cuò)誤】
?
12. const關(guān)鍵字:?----?不是“常量”,而是“只讀變量”;用得好的話大大提高程序的效率
const修飾的是只讀的變量,其值在編譯時(shí)不能被使用,因?yàn)榫幾g器在編譯時(shí)不知道其存儲(chǔ)的內(nèi)容。
const推出的初始目的,正是為了取代預(yù)編譯指令,消除它的缺點(diǎn),同時(shí)繼承它的優(yōu)點(diǎn)。
const和define的區(qū)別:const修飾的只讀變量,并且在定義的同時(shí)進(jìn)行初始化;const可以節(jié)省空間,避免不必要的內(nèi)存分配,同時(shí)提高效率;修飾一般變量,一般變量是指簡單類型的只讀變量;修飾數(shù)組;修飾指針;修飾函數(shù)的參數(shù),當(dāng)不希望這個(gè)參數(shù)值被函數(shù)體內(nèi)意外改變時(shí)使用;修飾函數(shù)的返回值,表示返回值不可被改變;在另一連接文件中引用const只讀變量。
【編譯器通常不為普通const只讀變量分配存儲(chǔ)空間,而使將它們保存在符號(hào)表中,這使得它成為一個(gè)編譯器件的值,沒有了存儲(chǔ)與讀內(nèi)存的操作,使得它的效率也很高;const定義的只讀變量從匯編的角度看,只是給出了對(duì)應(yīng)的內(nèi)存地址,而不是像define一樣給出的立即數(shù)】
const M = 3;??int a[M]; ---?錯(cuò)誤的,數(shù)組里面不能是變量,即使是只讀
#define M 3???int a[M]; ---?正確的,預(yù)處理的時(shí)候做宏替換
const?int?*p;//p可變,p指向的對(duì)象不可變
int?const?*p;//p可變,p指向的對(duì)象不可變
int?*const?p;//p不可變,p指向的對(duì)象可變
const?int?*const?p;//指針p和p指向的對(duì)象都不可變
?
13. volatile關(guān)鍵字:?---?判別普通工程師和嵌入式工程師
??防止編譯器優(yōu)化,做嵌入式這行的不認(rèn)識(shí)這個(gè)關(guān)鍵字,就要回家多修煉修煉啦!
?
14. extern關(guān)鍵字:
extern修飾變量或者函數(shù),以表示變量或者函數(shù)的定義在別的文件中。從而提示編譯器遇到此變量和函數(shù)時(shí)在其他模塊中尋找其定義。
?
15. struct關(guān)鍵字:?---?寫程序的時(shí)候盡量別使用全局變量,而是打包成結(jié)構(gòu)體
??將相關(guān)聯(lián)的數(shù)據(jù)打包成一個(gè)整體;空結(jié)構(gòu)體的大小不是0,而是1;
??柔性數(shù)組:結(jié)構(gòu)體最后的數(shù)組大小未知,內(nèi)核鏈表中用柔性數(shù)組較多。
Type *p=( Type*)malloc(sizeof(Type)+100*sizeof(int));
【柔性數(shù)組與結(jié)構(gòu)體沒關(guān)系,算不上結(jié)構(gòu)體的正式成員。】
struct和class:默認(rèn)屬性不同,struct是public,class是private。
?
16. union關(guān)鍵字:
??大小是聯(lián)合體中最大的成員的大小,而不是所有成員的大小和,此點(diǎn)和結(jié)構(gòu)體不同;同一時(shí)間聯(lián)合體只能訪問數(shù)據(jù)成員中的一個(gè),不能訪問多個(gè)。
用聯(lián)合體可以判斷大小端模式的問題:?
void check(void) {union{inti;intj;} stu;stu.i= 5;return(5 == stu.j):1,0; }17. enum關(guān)鍵字:
??---?枚舉定義的是一堆常量,比如星期,顏色等
?
18. typedef關(guān)鍵字:?---?起別名,注意與define的區(qū)別,個(gè)人認(rèn)為比define好用
typedef unsigned char uchar;
#define uchar unsigned char
(typedef結(jié)尾加分號(hào),define不需要)
推薦使用typedef,因?yàn)樵诮o指針進(jìn)行替換的時(shí)候,define往往達(dá)不到效果;
#define char* PPP
PPP a,b;//只有a是char*的,b不是,用typedef就不同
?
總結(jié)
- 上一篇: Linux中vi命令详解
- 下一篇: LACP模式链路聚合