相信這么努力的你 已經(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)。

