C語言初學(xué)者必須掌握的關(guān)鍵字熏兄!

其實小伙伴在寫代碼的時候摩桶,關(guān)鍵字還是用的比較多的帽揪,老九主要就平常中用到的常用關(guān)鍵字進(jìn)行總結(jié)转晰,便于小伙伴們更全面的理解其在代碼中的意圖查邢。

C語言關(guān)鍵字總結(jié)

static關(guān)鍵字C語言

const關(guān)鍵字C語言

register關(guān)鍵字用法

auto關(guān)鍵字

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

static關(guān)鍵字?


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

1未桥、局部變量:?

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

作用域:并沒有改變作用域亦镶,還是僅限于該語句塊。并且只在初次運行的時候進(jìn)行初始化袱瓮,下次調(diào)用時它的值是上一次函數(shù)調(diào)用結(jié)束之后的值染乌。每次調(diào)用后值會被保存。

例如:

輸出結(jié)果:

2懂讯、全局變量:?

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

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

3实蔽、函數(shù):?

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

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

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

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



小編給大家推薦一個學(xué)習(xí)氛圍超好的地方灵妨,C/C++交流企鵝裙:870963251解阅!適合在校大學(xué)生,小白泌霍,想轉(zhuǎn)行瓮钥,想通過這個找工作的加入。裙里有大量學(xué)習(xí)資料烹吵,有大神解答交流問題碉熄,每晚都有免費的直播課程



const關(guān)鍵字?

C語言中保留的一個關(guān)鍵字,它用來限定一個變量是只讀的肋拔,即不可變的锈津。

1、用const修飾一般變量?

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

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

2窿吩、const與指針搭配使用?

兩個基礎(chǔ)概念:指針常量和常量指針

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

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

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

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

注意:

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


register關(guān)鍵字用法

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

寄存器其實就是一塊一塊小的存儲空間曲管,只不過其存取速度要比內(nèi)存快得多却邓。

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

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

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

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

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

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

為啥要這么麻煩败А堤魁?速度蜜暑!就是因為速度铐姚。寄存器其實就是一塊一塊小的存儲空間,只不過其存取速度要比內(nèi)存快得多肛捍。

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

一些限制:?

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

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

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

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

在調(diào)用一個函數(shù)時占用一些寄存器以存放寄存器變量的值逸绎,函數(shù)調(diào)用結(jié)束后釋放寄存器。此后夭谤,在調(diào)用另外一個函數(shù)時又可以利用這些寄存器來存放該函數(shù)的寄存器變量棺牧。

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

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

注意:

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

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

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


auto關(guān)鍵字

用于聲明變量的生存期為自動冕茅,所有的變量默認(rèn)就是auto的。

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

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

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

優(yōu)點:?

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

缺點:?

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

總結(jié):

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窟蓝,一起剝皮案震驚了整個濱河市罪裹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌运挫,老刑警劉巖状共,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谁帕,居然都是意外死亡峡继,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門匈挖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碾牌,“玉大人,你說我怎么就攤上這事儡循〔奥穑” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵择膝,是天一觀的道長誓琼。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么腹侣? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任叔收,我火速辦了婚禮,結(jié)果婚禮上傲隶,老公的妹妹穿的比我還像新娘饺律。我一直安慰自己,他們只是感情好伦籍,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布蓝晒。 她就那樣靜靜地躺著,像睡著了一般帖鸦。 火紅的嫁衣襯著肌膚如雪芝薇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天作儿,我揣著相機與錄音洛二,去河邊找鬼。 笑死攻锰,一個胖子當(dāng)著我的面吹牛晾嘶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娶吞,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼垒迂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妒蛇?” 一聲冷哼從身側(cè)響起机断,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绣夺,沒想到半個月后吏奸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡陶耍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年奋蔚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烈钞。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡泊碑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毯欣,到底是詐尸還是另有隱情馒过,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布仪媒,位于F島的核電站沉桌,受9級特大地震影響谢鹊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜留凭,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一佃扼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔼夜,春花似錦兼耀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匠题,卻和暖如春拯坟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背韭山。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工郁季, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钱磅。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓梦裂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盖淡。 傳聞我的和親對象是個殘疾皇子年柠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容