C語言的關鍵字(一)

2022-03-28 13:13:24 字數 3882 閱讀 7414

每次講關鍵字之前,我總是問學生:c 語言有多少個關鍵字?sizeof 怎麼用?它是函式

嗎?有些學生不知道 c 語言有多少個關鍵字,大多數學生往往告訴我 sizeof 是函式,因為

它後面跟著一對括號。當投影儀把這 32 個關鍵字投到幕布上時,很多學生表情驚訝。有些

關鍵字從來沒見過,有的驚訝 c 語言關鍵字竟有 32 個之多。更有甚者,說大學老師告訴他

們 sizeof 是函式,沒想到它居然是關鍵字!由此可想而知,大學的計算機教育是多麼失敗!

表(1.1)c 語言標準定義的 32 個關鍵字

關鍵字 意 義

auto     宣告自動變數,預設時編譯器一般預設為 auto

int        宣告整型變數

double  宣告雙精度變數

long     宣告長整型變數

char     宣告字元型變數

float     宣告浮點型變數

short    宣告短整型變數

signed   宣告有符號型別變數

unsigned 宣告無符號型別變數

struct     宣告結構體變數

union      宣告聯合資料型別

enum      宣告列舉型別

static      宣告靜態變數

switch     用於開關語句

case        開關語句分支

default    開關語句中的「其他」分支

break      跳出當前迴圈

register    宣告暫存器變數

const       宣告唯讀變數

volatile     說明變數在程式執行中可被隱含地改變

typedef    用以給資料型別取別名(當然還有其他作用)下面的篇幅就一一講解這些關鍵字。

但在講解之前先明確兩個概念:

什麼是定義?什麼是宣告?它們有何區別?

舉個例子:

a)int i;

b)extern int i;(關於 extern,後面解釋)

哪個是定義?哪個是宣告?或者都是定義或者都是宣告?我所教過的學生幾乎沒有一

人能回答上這個問題。這個十分重要的概念在大學裡從來沒有被提起過!

什麼是定義:所謂的定義就是(編譯器)建立乙個物件,為這個物件分配一塊記憶體並給它

取上乙個名字,這個名字就是我們經常所說的變數名或物件名。但注意,這個名字一旦和

這塊記憶體匹配起來(可以想象是這個名字嫁給了這塊空間,沒有要彩禮啊。^_^),它們就同

生共死,終生不離不棄。並且這塊記憶體的位置也不能被改變。乙個變數或物件在一定的區

域內(比如函式內,全域性等)只能被定義一次,如果定義多次,編譯器會提示你重複定義

同乙個變數或物件。

什麼是宣告:有兩重含義,如下:

第一重含義:告訴編譯器,這個名字已經匹配到一塊記憶體上了(伊人已嫁,吾將何去何

從?何以解憂,唯有稀粥),下面的**用到變數或物件是在別的地方定義的。宣告可以出

現多次。

第二重含義:告訴編譯器,我這個名字我先預定了,別的地方再也不能用它來作為變數

名或物件名。比如你在圖書館自習室的某個座位上放了一本書,表明這個座位已經有人預

訂,別人再也不允許使用這個座位。其實這個時候你本人並沒有坐在這個座位上。這種聲

明最典型的例子就是函式引數的宣告,例如:

void fun(int i, char c);

好,這樣一解釋,我們可以很清楚的判斷:a)是定義;b)是宣告。

那他們的區別也很清晰了。記住,定義宣告最重要的區別:定義建立了物件並為這個

物件分配了記憶體,宣告沒有分配記憶體(乙個抱伊人,乙個喝稀粥。^_^)。

1.1,最寬恒大量的關鍵字----auto

auto:它很寬恒大量的,你就當它不存在吧。編譯器在預設的預設情況下,所有變數

都是 auto 的。

1.2,最快的關鍵字---- register

register:這個關鍵字請求編譯器盡可能的將變數存在 cpu 內部暫存器中而不是通過內

存定址訪問以提高效率。注意是盡可能,不是絕對。你想想,乙個 cpu 的暫存器也就那麼

幾個或幾十個,你要是定義了很多很多 register 變數,它累死也可能不能全部把這些變數放

入暫存器吧,輪也可能輪不到你。

1.2.1,皇帝身邊的小太監----暫存器

不知道什麼是暫存器?那見過太監沒有?沒有?其實我也沒有。沒見過不要緊,見過就

麻煩大了。^_^,大家都看過古裝戲,那些皇帝們要閱讀奏章的時候,大臣總是先將奏章交

給皇帝旁邊的小太監,小太監呢再交給皇帝同志處理。這個小太監只是個中轉站,並無別

的功能。

好,那我們再聯想到我們的 cpu。cpu 不就是我們的皇帝同志麼?大臣就相當於我們

的記憶體,資料從他這拿出來。那小太監就是我們的暫存器了(這裡先不考慮 cpu 的高速緩

存區)。資料從記憶體裡拿出來先放到暫存器,然後 cpu 再從暫存器裡讀取資料來處理,處理

完後同樣把資料通過暫存器存放到記憶體裡,cpu 不直接和記憶體打交道。這裡要說明的一點

是:小太監是主動的從大臣手裡接過奏章,然後主動的交給皇帝同志,但暫存器沒這麼自覺,

它從不主動幹什麼事。乙個皇帝可能有好些小太監,那麼乙個 cpu 也可以有很多暫存器,

不同型號的 cpu 擁有暫存器的數量不一樣。

為啥要這麼麻煩啊?速度!就是因為速度。暫存器其實就是一塊一塊小的儲存空間,只

不過其訪問速度要比記憶體快得多。進水樓台先得月嘛,它離 cpu 很近,cpu 一伸手就拿到

資料了,比在那麼大的一塊記憶體裡去尋找某個位址上的資料是不是快多了?那有人問既然

它速度那麼快,那我們的記憶體硬碟都改成暫存器得了唄。我要說的是:你真有錢!

1.2.2,使用 register 修飾符的注意點

雖然暫存器的速度非常快,但是使用 register 修飾符也有些限制的:register 變數必須是

能被 cpu 暫存器所接受的型別。意味著 register 變數必須是乙個單個的值,並且其長度應小

於或等於整型的長度。 而且 register 變數可能不存放在記憶體中,所以不能用取址運算子「&」

來獲取 register 變數的位址。1.3,最名不符實的關鍵字----static

不要誤以為關鍵字 static 很安靜,其實它一點也不安靜。這個關鍵字在 c 語言裡主要有

兩個作用,c++對它進行了擴充套件。

1.3.1,修飾變數

第乙個作用:修飾變數。變數又分為區域性和全域性變數,但它們都存在記憶體的靜態區。

靜態全域性變數,作用域僅限於變數被定義的檔案中,其他檔案即使用 extern 宣告也沒法

使用他。準確地說作用域是從定義之處開始,到檔案結尾處結束,在定義之處前面的那些

**行也不能使用它。想要使用就得在前面再加 extern ***。噁心吧?要想不噁心,很簡單,

直接在檔案頂端定義不就得了。

靜態區域性變數,在函式體裡面定義的,就只能在這個函式裡用了,同乙個文件中的其他

函式也用不了。由於被 static 修飾的變數總是存在記憶體的靜態區,所以即使這個函式執行結

束,這個靜態變數的值還是不會被銷毀,函式下次使用時仍然能用到這個值。

C語言關鍵字

c語言關鍵字 在檔案範圍的教訓和關鍵字,你知道靜態變數保持他們的價值觀,甚至不在他們超出範圍的破壞。比如說呢。int generateid int main this program prints 01 2 請注意,s nid一直保持它的價值的跨多個函式呼叫。static關鍵字有另一種意思當應用到全...

C語言關鍵字

關鍵字就是已被c語言本身使用,不能作其它用途使用的字。例如關鍵字不能用作變數名 函式名等 由ansi標準定義的c語言關鍵字共32個 auto double int struct break else long switch case enum register typedef char extern...

c語言關鍵字

c 語言標準定義的32 個關鍵字 1 auto 宣告自動變數,預設時編譯器一般預設為auto int 宣告整型變數 double 宣告雙精度變數 雙精度浮點型 long 宣告長整型變數 char 宣告字元型變數 float 宣告浮點型變數 單精度浮點型 6.1 float的有效位通常有 位,指的是小...