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