C語言關鍵字詳解

2022-03-12 00:46:20 字數 4151 閱讀 8480

相對於其他語言來說,c語言的關鍵字算是少的了。在c98中關鍵子總共只有32個,我們來分析一下每個關鍵字在c語言中它獨特的作用。

1、關於資料型別的關鍵字

(1) char :宣告字元型變數或函式 

(2) double :宣告雙精度變數或函式 

(3) enum :宣告列舉型別

enum型別可以增加可讀性,可移植性;在enum中定義的每個物件,預設都是從0開始,當然也可以自定義。如下:

enum

color;

enum number;

color中red=0,black=1,white=2;

number中one=1,two=2,three=3;

(4) float:宣告浮點型變數或函式 

(5) int: 宣告整型變數或函式 

(6) long :宣告長整型變數或函式 

(7) short :宣告短整型變數或函式 

(8) signed:宣告有符號型別變數或函式 

(9) struct:宣告結構體變數或函式

請參考(10) union:宣告共用體(聯合)資料型別 

union型別可以用來提高記憶體的使用率,如下:

int

main();

union unoin p;

p.a = 100

;

/*執行語句1

*/p.b = 10.0

;

/*執行語句2

*/p.c = "

hello world!";

/*執行語句3

*/return0;

}

如果不使用union,我們需要分別定義int,float,cahr*,需要占用12位元組的記憶體空間,但是當我們使用union時,只需要占用4位元組即可;但是需要注意的時,我們在上面那個**中執行語句2或者3中需要用到int a時,就無法使用union了,必須單獨定義int a;否則讀出的a值將會錯誤的。

(11) unsigned:宣告無符號型別變數或函式 

(12) void :宣告函式無返回值或無引數,宣告無型別指標(基本上就這三個作用)

2、關於控制語句的關鍵字

迴圈語句

(13) for:一種迴圈語句(可意會不可言傳) 

(14) do :迴圈語句的迴圈體 

(15) while :迴圈語句的迴圈條件 

條件判斷語句

(16)if: 條件語句 

(17)else :條件語句否定分支(與 if 連用) 

(18)switch :用於開關語句 

(19)case:開關語句分支 

(20)default:開關語句中的「其他」分支

在case...switch語句中,當乙個條件輸入,從滿足條件的那個case語句開始執行,直到遇到跳轉指令(break;return;goto;contine;),所以建議在每條case語句後面加上break,除非你是刻意不那麼做的。

跳轉語句

(21)goto:無條件跳轉語句

用goto語句可以保證程式存在唯一的出口,避免了過於龐大的if巢狀,但是隨意使用goto語句就會對程式帶來很大的隱患(可能會跳過變數的初始化、重要的計算語句等),影響**的健壯性和可讀性。所以不推薦過多地使用。

(23) break:跳出當前迴圈 

(24)return :子程式返回語句(可以帶引數,也可以不帶引數)

在return語句之後函式中的所有指令都不會執行,所以需要確保在return語句之前執行完必要的指令。 

3、關於儲存型別的關鍵字

(25)auto :宣告自動變數 一般不使用,因為當我們宣告乙個區域性變數是預設就是auto

(26)extern:宣告變數是在其他檔案正宣告(也可以看做是引用變數),一般也需要經常使用,因為在c語言裡面,全域性變數和函式都是預設extern的屬性

(27)register:宣告暫存器變數,宣告為register的變數是存放在cpu的暫存器裡面的,所以讀取速度非常快,但是數量有限,當定義的多個register變數,編譯器多的那些register變數轉換為auto變數。

(28)static :宣告靜態變數

a、當我們把乙個全域性變數宣告為static時:只有它的作用範圍變為本原始檔,也就是屬性由external變為internal,其它不變;

b、當我們把函式宣告為static時:它的作用範圍變為本原始檔,也就是屬性由external變為internal;

c、當我們把區域性變數宣告為static時:預設初始化值為0,並且只在第一次定義時初始化;記憶體儲存區域不再是棧,而是在靜態儲存區;生命週期不再是所在函式,而是整個程序;其它不變。

4、其它一些關鍵字

(29)const :宣告唯讀變數

由const宣告的變數,必須在定義時進行初始化。如下:

const

int num = 10;//

在定義處初始化,並且變數的值不允許再改變

既然變數的值都不允許改變,那麼這個變數定義了有啥用?哈哈,用處大著呢。首先在我們定義陣列的時候,陣列的大小就可以用const定義的常量來表示,這個就跟#define一樣,但是它是型別安全的,#define是預處理命令,只是進行簡單的字元替換,而編譯器會對const定義的變數進行型別檢查;其次,當我們需要乙個不再改變的變數時,就可以用const,比如說定義乙個人的性別,自打你一出生就已經決定了你的性別,不出意外的話,這輩子都不會改變了,所以就把它定義為唯讀的,當然有人也認為不定義為const也可以的嘛,只要自己不改變它就行,但是如果是那樣的話,就需要人為來控制了,萬一哪天忘了,把它改了怎麼辦?所以對於一些唯讀或者常量最好用const來定義。

當我們把const與指標變數放在一起的時候,問題就變得複雜了。比如我們定義如下:

const

int *p1;

intconst *p2;

int * const

p3;int

const * const p4;

指標變數p1:const在資料型別之前,修飾的是p1所指向的物件,所以p1所指向的物件的值為常量唯讀,不能改變,但是p1本身可以改變;

指標變數p2:const在*之前,這種情況與p1相同;

指標變數p3:const在*之後,修飾的是變數p3,所以變數p3本身為常量唯讀,而p3所指向的物件可以改變;

指標變數p4:有兩個const分別修飾變數p4和p4所指向的物件,所以p4本身和p4所指向的物件都為常量唯讀,都不可以改變。

其實這些也很容易記住,只要看const是在*前還是在*後面,在*前修飾的就是指標所指向的物件,在*後,修飾的就是指標本身。

下面來舉個簡單的例子說明:

int

main()

在上面**中,error(1)和error(2)很容易理解,因為const在*之後,所以指標p3,p4本身為唯讀,在定義時必須初始化。error(3)是因為對於p1指標,const在*之前,所以p1所指向的物件不能改變。error(4)和error(5)是因為對於p3,p4,有const在*之後,所以指標本身唯讀,在初始化之後,就無法再改變了。

(30)sizeof:計算資料型別長度

很多人不理解sizeof與strlen的區別:sizeof是運算子,而strlen是函式;sizeof計算的是資料型別的大小,而strlen計算的是字串的長度;sizeof的引數既可以是資料型別,也可以是變數,而strlen的引數只能是char*,而且必須是空字元結尾;sizeof返回值型別為unsigned,而strlen返回值為signed,因為它需要返回負數來表示出錯情況。

(31)typedef:用以給資料型別取別名

volatile 修飾的變數不允許編譯器對與它有關的運算做任何優化;用volatile定義的變數可能會在程式外被改變,所以每次都必須從記憶體中讀取,而不能把他放在cache或暫存器中重複使用。一般用在以下幾個地方:

a、並行裝置的硬體暫存器(如:狀態暫存器) 

b、乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables) 

c、多執行緒應用中被幾個任務共享的變數 

以上結論只是個人的見解與建議,如果上述所說有誤或者大家有不同的見解,歡迎指正與討論。

C語言關鍵字詳解

一 c語言的關鍵字共有32個,根據關鍵字的作用,可分其為資料型別關鍵字 控制語句關鍵字 儲存型別關鍵字和其它關鍵字四類。1 資料型別關鍵字 12個 1 char 宣告字元型變數或函式 2 double 宣告雙精度變數或函式 3 enum 宣告列舉型別 4 float 宣告浮點型變數或函式 5 int...

C語言關鍵字詳解

c的關鍵字共32個 資料型別關鍵字 12 char,short,int,long,float,double,unsigned,signed,union,enum,void,struct 控制語句關鍵字 12 if,else,switch,case,default,for,do,while,break...

C語言volatile關鍵字詳解

volatile提醒編譯器它後面所定義的變數隨時都有可能改變,因此編譯後的程式每次需要儲存或讀取這個變數的時候,都會直接從變數位址中讀取資料。如果沒有volatile關鍵字,則編譯器可能優化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數由別的程式更新了的話,將出現不一致的現象。下面舉例說明。在d...