1. 程式人生 > 實用技巧 >【老九學堂】【初識C語言】C語言保留字(關鍵字)詳解

【老九學堂】【初識C語言】C語言保留字(關鍵字)詳解

保留字(reserved word)

  保留字又稱關鍵字。

  指在高階語言中已經定義過的字,使用者不能再將這些字作為變數名或過程名使用。

  每種程式設計語言都規定了自己的一套保留字。

  例如:BASIC語言規定不能使用LIST作為變數名或過程名,因為LIST是一個BASIC語言專用於顯示記憶體程式的命令。

C有 22+10 = 32個關鍵字

C++ 有22+10+11+20 = 63 個關鍵字

JAVA 有22+ 9+ 17 = 48 個關鍵字 ps:以上內容來自百科。

其中,C89中,(C語言標準)中,

型別說明保留字:

int,long,short,float,double,char,unsigned,signed,const,void,volatile,enum,struct,union

語句定義保留字:

if,else,goto,switch,case,do,while,for,continue,break,return,default,typedef

儲存類說明保留字:

auto,register,extern,static

長度運算子保留字:

sizeof

具體含義如下:

下面,我們就幾個相對比較容易用錯的保留字進行分析,主要包括

return, void, const, break, continue

以下內容參閱《c程式設計競賽實訓教程》和一些大牛部落格結合寫的。

1.return

return:結束一個函式並返回其後面表示式中的值。

初學的時候,有些不理解main 函式中return 0;有什麼用,在寫程式的時候老是忘記帶上了。其實,帶上return 0;是很有必要的。

main函式的返回值用於說明程式的退出狀態,如果返回0,表示程式正常退出,否則表示程式異常退出。返回值傳遞給程式的啟用者(作業系統)。

如果沒有寫return語句的話,c99(c語言標準)規定編譯器自動在生成的目標檔案中加入return 0;表示正常退出。

所以,為了程式碼規範,我們一般都必須帶上return 0;

具體操作----- return (表示式);

其中,括號是可以省略的。一般不省略,如果返回值為表示式的時候容易造成混淆。

return返回值的型別:一般是函式定義的型別,如果return後表示式的值型別和函式值的型別不一致,則以函式函式型別為準,即:函式型別決定返回值型別。

需要注意的一點,也是易錯的一點是:return不能返回指向區域性變數的型別。----因為在函式結束時區域性變數被自動銷燬(上篇部落格提及的區域性變數的生存週期),則返回的指標為指向已釋放的空間,再通過此指標進行操作就會產生錯誤。

下面通過程式具體說明:

看下輸出結果 4,3

程式中,函式test的返回值為指向區域性變數num的指標,當主函式呼叫test函式的時候,返回ptr指標並且賦值給p指標變數,即num變數的地址賦給了p,但是必須明白,在test函式結束的時候,區域性變數num的空間被釋放了,這樣用p來引用這個空間就會出錯。

乍一看,和預期的一樣,但是實際上,這樣的程式是存在隱患的。

下面改改這個程式,就知道錯在哪了。

執行結果:15,7(也可能是15,9視具體環境而定。)

在這裡,多了個test2函式。發現結果並不是我們預料的15,3 。p指向空間的資料不是之前num所賦值的3.

這正印證了我們之前說過了,這樣的返回存在隱患。在test函式呼叫完後,系統釋放之前給num分配的空間,但是p指標仍然指向那塊區域。

在呼叫test2的時候,系統要為x,y分配空間。這時候就會把之前釋放的那塊空間給x,y再次分配使用,使用在賦值語句後,該空間的值發現了改變,使得*p發生了改變。

所以,切記 return不能返回指向區域性變數的型別。

2.void

void :void為空型別。void *為空型別指標。

其中,void a;是不允許的。每次定義一個變數,系統都會為其分配空間,而void型別無法確定,系統就不知道該為它分配多大的空間,顯然是不合理的。

void *p;是允許的, 因為這是一個指標變數,系統都是預設分配四個位元組的空間,至於具體指向的空間總存放的資料型別,就由使用者自行操作。

並且,在操作的時候,要把該void指標強制轉換為相應型別的指標後才可進行操作。

如:

即:在使用void型別指標變數時,其他型別的地址可以直接賦值給void型別的指標變數,但反過來,void型別的指標變數賦值給其他型別的指標變數或取其所指空間資料時必須進行強轉。

3.const

const:constant的縮寫,意為不變。即用const修飾的變數的不允許改變的。也可稱為只讀變數。

例如:int const m = 10; const int m = 10; (二者可以認為等價,const定義一般的變數比較簡單。例如該例中都是限定m為10)

但是要注意一點,只讀變數雖然值不能改變,但它還是變數,不是常量。

如 int const M = 10; int a[M]; 這樣定義陣列是錯誤的。我們知道,定義陣列時,陣列元素個數必須是常量(這樣系統才知道要分配多大的空間),而M的本質是變數,只是值不改變的變數而已。

所以,一般我們定義陣列採用這樣的操作:

下面討論下const定義指標,這就比較複雜了。

至於地址,資料,拿const int *p;舉例。此時,p=&a;操作是允許的,(修改地址)。而*p=10;是允許的(試圖改變資料造成錯誤)。

在判讀是修飾*p還是p時,我們可以先將定義中的型別識別符號去掉(int),再觀察const後面修飾的內容。

4 break,continue

至於break和continue,二者關係比較密切,結合探討。break退出當前迴圈,continue退出當次迴圈

continue

1、結束本次迴圈(不執行本次迴圈中continue後面的語句),繼續下次迴圈條件判斷;

2、不可作用於switch語句。當在switch中使用,這個continue實際是作用於其所屬的迴圈結構;若它不屬於任何一個迴圈,程式將因此報錯!

break

1、結束整個迴圈,並停止下次迴圈條件判斷;

2、可以作用於switch語句。

具體區別如下:

break和continue的區別如下:

break可用於switch語句,表示跳出整個switch塊,而continue則不能用於switch語句

它們都可用於迴圈語句的迴圈體,所謂的區別也應該是它們對迴圈次數的影響不同。break用於立即退出當前迴圈,而continue僅跳過當次迴圈(本次迴圈體內不執行continue語句後的其它語句,但下次迴圈還會執行)。舉例說明。


上面的迴圈會因為break語句而在i=6時提前終止,這樣s的最終值就是1+2+3+4+5

如將break換成continue

當i=6時就不會將i累加到s中,s的最終值是1+2+3+4+5+7+8+9+10,唯獨少一個6。

安裝遇到問題,可加老九君個人QQ:614940318,請備註來自CSDN
老九學堂免費C、C++、Java課程地址:https://study.163.com/courses-search?keyword=老九學堂

徐老師線下全棧就業班開始報名啦~

零基礎開講,8個月,Java全棧學習,終身推薦就業