C語言初學者必須掌握的關鍵字!超全

相信這么努力的你 已經(jīng)置頂了我?

其實小伙伴在寫代碼的時候,關鍵字還是用的比較多的,星辰要就平常中用到的常用關鍵字進行總結,便于小伙伴們更全面的理解其在代碼中的意圖。

C語言關鍵字總結

static關鍵字C語言

const關鍵字C語言

register關鍵字用法

auto關鍵字

inline內聯(lián)函數(shù)

static關鍵字?

static可以用來修飾局部變量、全局變量、函數(shù)

1、局部變量:?

生命周期:原先存在棧中,生命周期語句執(zhí)行完畢便結束了?,F(xiàn)在存放到靜態(tài)數(shù)據(jù)區(qū),生命周期持續(xù)到整個程序執(zhí)行結束。

作用域:并沒有改變作用域,還是僅限于該語句塊。并且只在初次運行的時候進行初始化,下次調用時它的值是上一次函數(shù)調用結束之后的值。每次調用后值會被保存。

例如:

輸出結果:

2、全局變量:?

對于一個全部變量,既可以在本源文件中被訪問到,也可以在同一個工程的其它源文件中被訪問(只需用extern進行聲明即可)。

如果加上static,限制該全局變量的作用域范圍,由原來的整個工程可見變?yōu)楸驹次募梢姟?/p>

3、函數(shù):?

與修飾全局變量大同小異,就是改變了函數(shù)的作用域。

修飾函數(shù)時還有一處不同,就是調用靜態(tài)函數(shù)時,函數(shù)指針指向的地址始終是固定的,而普通函數(shù)每次返回的地址不一樣(這條特性是一個工作老手告訴老九的,還沒來得及驗證)

extern用在變量或者函數(shù)的聲明前,用來說明“此變量/函數(shù)是在別處定義的,要在此處引用”。另外,用extern會加速程序的編譯過程,這樣能節(jié)省時間。

C++中static還有一些不同,這里就暫時先不討論。

const關鍵字?

C語言中保留的一個關鍵字,它用來限定一個變量是只讀的,即不可變的。

1、用const修飾一般變量?

用const修飾的變量必須在聲明時進行初始化(用來修飾函數(shù)的形參除外)。

一旦一個變量被const修飾后,在程序中除初始化外對這個變量進行的賦值都是錯誤的。

2、const與指針搭配使用?

兩個基礎概念:指針常量和常量指針

指針常量:即指針本身的值是不可改變的,而指針指向的變量的值是可以改變的;

常量指針:即指針指向的變量的值是不可改變的,而指針本身的值是可以改變的;

如果const在’*’左邊,則表示指針指向的變量的值不可變;

如果const在’*’右邊,則表示指針的值是不可變的;

注意:

不能顯式地通過賦值語句去改變a的值,但是不代表在程序中不能通過其它方法來修改這個值。

register關鍵字用法

register:這個關鍵字請求編譯器盡可能的將變量存在CPU 內部寄存器中而不是通過內存尋址訪問以提高效率。注意是盡可能,不是絕對。

寄存器其實就是一塊一塊小的存儲空間,只不過其存取速度要比內存快得多。

數(shù)據(jù)從內存里拿出來先放到寄存器,然后CPU 再從寄存器里讀取數(shù)據(jù)來處理,處理完后同樣把數(shù)據(jù)通過寄存器存放到內存里,CPU 不直接和內存打交道。

有個故事,叫皇帝身邊的小太監(jiān),挺形象的:

大家都看過電視戲,那些老總們要閱讀文件的時候,管理層總是先將奏章交給皇帝旁邊的助理,助理呢再交給老總處理。這個小太監(jiān)只是個中轉站,并無別的功能。?

好,那我們再聯(lián)想到我們的CPU。CPU 不就是我們的老總么?管理員就相當于我們的內存,數(shù)據(jù)從他這拿出來。那助理就是我們的寄存器了(這里先不考慮CPU 的高速緩存區(qū))。

數(shù)據(jù)從內存里拿出來先放到寄存器,然后CPU 再從寄存器里讀取數(shù)據(jù)來處理,處理完后同樣把數(shù)據(jù)通過寄存器存放到內存里,CPU 不直接和內存打交道。

這里要說明的一點是:小太監(jiān)是主動的從大臣手里接過奏章,然后主動的交給皇帝,但寄存器沒這么自覺,它從不主動干什么事。一個皇帝可能有好些小太監(jiān),那么一個CPU 也可以有很多寄存器,不同型號的CPU 擁有寄存器的數(shù)量不一樣。

為啥要這么麻煩???速度!就是因為速度。寄存器其實就是一塊一塊小的存儲空間,只不過其存取速度要比內存快得多。

進水樓臺先得月嘛,它離CPU 很近,CPU 一伸手就拿到數(shù)據(jù)了,比在那么大的一塊內存里去尋找某個地址上的數(shù)據(jù)是不是快多了?那有人問既然它速度那么快,那我們的內存硬盤都改成寄存器得了唄。我要說的是:你真有錢!

一些限制:?

(1)register變量必須是能被CPU所接受的類型。

這通常意味著register變量必須是一個單個的值,并且長度應該小于或者等于整型的長度。不過,有些機器的寄存器也能存放浮點數(shù)。

(2)因為register變量可能不存放在內存中,所以不能用“&”來獲取register變量的地址。

(3)只有局部自動變量和形式參數(shù)可以作為寄存器變量,其它(如全局變量)不行。

在調用一個函數(shù)時占用一些寄存器以存放寄存器變量的值,函數(shù)調用結束后釋放寄存器。此后,在調用另外一個函數(shù)時又可以利用這些寄存器來存放該函數(shù)的寄存器變量。

(4)局部靜態(tài)變量不能定義為寄存器變量。不能寫成:register static int a, b, c;

(5)由于寄存器的數(shù)量有限(不同的cpu寄存器數(shù)目不一),不能定義任意多個寄存器變量,而且某些寄存器只能接受特定類型的數(shù)據(jù)(如指針和浮點數(shù)),因此真正起作用的register修飾符的數(shù)目和類型都依賴于運行程序的機器,而任何多余的register修飾符都將被編譯程序所忽略。

注意:

早期的C編譯程序不會把變量保存在寄存器中,除非你命令它這樣做,這時register修飾符是C語言的一種很有價值的補充。

然而,隨著編譯程序設計技術的進步,在決定哪些變量應該被存到寄存器中時,現(xiàn)在的C編譯環(huán)境能比程序員做出更好的決定。

實際上,許多編譯程序都會忽略register修飾符,因為盡管它完全合法,但它僅僅是暗示而不是命令。

auto關鍵字

用于聲明變量的生存期為自動,所有的變量默認就是auto的。

inline內聯(lián)函數(shù)

調用函數(shù)時需要一定的時間和空間的開銷。C++提供一種提高效率的方法,即在編譯時將函數(shù)調用處用函數(shù)體替換,類似于C語言中的宏展開。這種在函數(shù)調用處直接嵌入函數(shù)體的函數(shù)稱為內聯(lián)函數(shù)(inline function),又稱內嵌函數(shù)或內置函數(shù)。

注意:是在函數(shù)定義時增加 inline 關鍵字,而不是在函數(shù)聲明時。

優(yōu)點:?

內聯(lián)函數(shù)可以有效避免函數(shù)調用的開銷,程序執(zhí)行效率更高

缺點:?

如果被聲明為內聯(lián)函數(shù)的函數(shù)體非常大,則編譯器編譯后程序的可執(zhí)行碼將會變得很大。當內聯(lián)函數(shù)的函數(shù)體過大時,一般的編譯器會放棄內聯(lián)方式,而采用普通的方式調用函數(shù)。這樣,內聯(lián)函數(shù)就和普通函數(shù)執(zhí)行效率一樣了。

總結:

通常在程序設計過程中,我們會將一些頻繁被調用的短小函數(shù)聲明為內聯(lián)函數(shù)。

調用內聯(lián)函數(shù)和調用正規(guī)函數(shù)是等價的,差別僅僅是更快

今天的干貨小伙伴們都掌握了嗎?編程語言的基礎一定要掌握牢固,才能在以后編程項目的時候運用如飛哦~

問:

以下程序段中的變量已正確定義:

for( i=0;?i<4;?i++,i++?)

for( k=1;?k<3;?k++?);?printf("*" );

程序段的輸出結果是( )。? (C語言)

A) ?**

B) ?****

C) ?*

D) ?********

上期問題:

下關于邏輯運算符兩側運算對象的敘述中正確的是( )。(C語言)

A) ?可以是任意合法的表達式

B) ?只能是整數(shù)0或非0整數(shù)

C) ?可以是結構體類型的數(shù)據(jù)

D) ?只能是整數(shù)0或1

上期答案:A

解析:C語言的邏輯運算符比較特別,它的操作數(shù)沒有明確的數(shù)據(jù)類型,可以是任意合法的表達式,所以選擇A)。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容