C語言關鍵字 auto和register

2021-06-05 13:44:40 字數 3082 閱讀 7118

在我對c語言進行培訓的時候,往往就是從c語言的關鍵字入手,因為c語言的關鍵字蘊含了c語言的全部的詞彙,囊括了c語言裡大量知識要點,從c語言關鍵字開刀,首先可以對你之前所學知識進行複習,其次,切磋一下和作者有什麼不同的見解,廢話少說,讓我們從關鍵字開始。

關鍵字,又叫保留字,是編譯器能識別的特殊單詞,每種計算機語言都會有其特定的關鍵字,c語言中有32位關鍵字。

問:為什麼要有關鍵字?

答:關鍵字是程式設計中**必須包含的部分,編譯器在編譯c**的時候,必然要將c**進行斷句,將**分割成不同部分,將這些部分分別進行解析和編譯。

int a = 10;  int是關鍵字,編譯器看到它出現,會將它後面的字元作為整型變數名來處理。

也就是說,關鍵字是編譯器能認識的特殊字串符號。

關鍵字的數量是由編譯器來決定的,關鍵字大小寫敏感性也和編譯器有關。如果關鍵字寫錯,那麼在**的解析過程中,編譯器就會報錯:符號不能識別或符號不能被解析。

每個關鍵字有著不同的意義,用來告知編譯器程式設計者的目的。

關鍵字分類

32個關鍵字每個都有不同的意義,大體上根據其意義可以分為以下幾類(下劃線表示不同分類中有交集):

1)        非常見:auto、register、volatile、goto

2)        儲存相關:const、extern、register、volatile、static、auto、signed、unsigned

3)        資料型別:char、short、int、float、long、double、struct、union、enum、void

4)        邏輯控制:if、else、for、while、do、break、continue、return、default、switch、case、goto

5)        特殊用途:sizeof、typedef

我相信,大部分關鍵字我們都能認識,並且能夠使用,有一部分可能很少見,甚至一點印象也沒有:它也是c語言的關鍵字???

1.**刺客:auto

描述:auto關鍵字在我們寫的**裡幾乎看不到,但是它又無處不在,它是如此的重要,又是如此的與世無爭,默默的履行著自己的義務,卻又隱姓埋名。

作用:c程式是面向過程的,在c**中會出現大量的函式模組,每個函式都有其生命週期(也稱作用域),在函式生命週期中宣告的變數通常叫做區域性變數,也叫自動變數。例如:

[cpp]view plain

copy

intfun()  

整型變數a在fun函式內宣告,其作用域為fun函式內,出來fun函式,不能被引用,a變數為自動變數。也就是說編譯器會有int a = 10之前會加上auto的關鍵字。

auto的出現意味著,當前變數的作用域為當前函式或**段的區域性變數,意味著當前變數會在記憶體棧上進行分配。

記憶體棧:

如果大家學過資料結構,應該知道,棧就是先進後出的資料結構。它類似於我們用箱子打包書本,第一本扔進去大英,第二本扔進行高數,第三本扔進行**,那麼取書的時候,先取出來第一本是**,第二是高數,第三本是大英。

棧的操作為入棧和出棧,入棧就是向箱子裡扔書,出棧就是從箱子裡取書。那麼這和我們的auto變數分配空間有什麼關係呢?

由於乙個程式中可能會有大量的變數宣告,每個變數都會占有一定的記憶體空間,而記憶體空間對於計算機來說是寶貴的硬體資源,因此合理的利用記憶體是編譯器要做的乙個主要任務。有的變數是一次性使用的,如區域性變數。有的變數要伴隨著整個程式來使用的,如全域性變數。為了節省記憶體空間,優化效能,編譯器通常會將一次性使用的變數分配在棧上。也就是說,**中宣告乙個一次性變數,就在棧上進行入棧操作。當該變數使用完了(生命週期結束),進行出棧操作。這樣,在執行不同的函式的時候,就會在乙個棧上進行出入棧操作,也就是說它們在頻繁的使用乙個相同的記憶體空間,從而可以更高效的利用記憶體。

ps:有的編譯器為了提高效率,在出棧時不會進行資料清空,這也就意味著,下個函式裡的變數在入棧使用該空間時,裡面的資料是上一次變數操作的結果。

2.閃電飛刀:register

描述:register就和它的名字一樣,很少出現在**世界中,因為敢稱為閃電飛刀的變數,通常只會在一些特定場合才能出現。它是如此的快,以致於cpu都對其刮目相看,但是它有乙個致命的缺點,它的速度「看心情」而定,不是每一次都能讓人滿意。

作用:如果乙個變數被register來修辭,就意味著,該變數會作為乙個暫存器變數,讓該變數的訪問速度達到最快。比如:乙個程式邏輯中有乙個很大的迴圈,迴圈中有幾個變數要頻繁進行操作,這些變數可以宣告為register型別。

暫存器變數:暫存器變數是指乙個變數直接引用暫存器,也就是對變數名的操作的結果是直接對暫存器進行訪問。暫存器是cpu的親信,cpu操作的每個運算元和操作結果,都由暫存器來暫時儲存,最後才寫入到記憶體或從記憶體中讀出。也就是說,變數的值通常儲存在記憶體中,cpu對變數進行讀取先是將變數的值從記憶體中讀取到暫存器中,然後進行運算,運算完將結果寫回到記憶體中。為什麼要這麼設計,而不直接對變數的值從記憶體中進行運算,而要再借助於暫存器?這是由於考慮到效能的問題才這麼設計的。在計算機系統中,包含有很多種不同型別的儲存器,如表***所示。

表*** 計算機儲存器分類

名稱速度

特點用途

靜態儲存器

最快造價高,體積大,適合小容量的快取

暫存器,快取

動態儲存器

較快造價較低,體積較小,適合大容易儲存資料

內存在計算機中cpu的運算速度最快,現在都達到3ghz左右,而相對應的儲存器速度卻相對慢很多,訪問速度最快的暫存器和快取,由於其體積又大,不適合大容量的使用,所以只能二者相接合的方式來提高效率。程式**儲存在記憶體中,當使用資料時,將其送到暫存器,讓cpu來訪問,使用完畢,送回記憶體儲存。而c語言又允許使用暫存器來儲存變數的值,很明顯這樣能大大提高程式的執行速度,但是,暫存器的個數是有限的,x86也就是十幾個,arm最多才37個。我們不可能將全部的變數都宣告為暫存器變數,因為其它**也要使用暫存器,同樣,我們宣告的暫存器變數也不一定直接儲存在暫存器中,因為暫存器可能全部都在被其它**占用。編譯器只能是盡量的為我們的變數安排在暫存器中。

在使用暫存器變數時,請注意:

auto關鍵字 decltype關鍵字

自動型別推斷 1 使用auto關鍵字的變數必須有初始值。在定義的時候進行初始化 2 函式引數和模板引數不能被宣告為auto。3 使用auto關鍵字進行型別推導時,如果初始化表示式是引用型別,編譯器會去除引用,除非顯示宣告 4 使用auto使用auto關鍵字進行型別推導時,編譯器會自動忽略頂層cons...

C 之auto關鍵字

在那些情況下要申明型別 定義變數型別 函式返回值,函式引數 表示式返回變數型別 為什麼auto 在開發實踐中,有時候我們並不能非常容易地確定乙個變數應該具有的資料型別。比如,將某個複雜表示式作為初始值賦值給乙個新定義的變數時,我們往往很難確定這個表示式的資料型別,從而無法確定變數應有的資料型別。為了...

C 的auto關鍵字

c中的auto關鍵字沒啥大用,因為它是用於顯式地說明變數是自動儲存型別的,但是auto又只能用於預設就是自動儲存的區域性變數,即函式中定義的變數和函式的引數,所以 emmmm,很尷尬的工作,大家根本不鳥他。比如 intft int x c 看出了auto的尷尬,於是需要有新工作的時候就沒有引入新的關...