其實小伙伴在寫代碼的時候摩桶,關(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ǔ)一定要掌握牢固塞淹,才能在以后編程項目的時候運用如飛哦~