久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【連載】(學(xué)了這么多年C語言,你真的了解static關(guān)鍵詞嗎)樂創(chuàng)DIY C語言講義?——4.4節(jié)

 樂創(chuàng)客搬運工 2021-01-27

4.4 變量的補充
前面內(nèi)容中,,我們已經(jīng)討論了變量的定義,,但是由于函數(shù)的概念還沒有引入,因而這是不全面的,,本節(jié)開始,,我們再來補充一些變量的其他內(nèi)容,這就相當(dāng)于對變量這個概念的重新認識,。
我們之前講的變量定義,,都是定義在“main()“函數(shù)里面的,,并且告訴大家了變量定義的一個原則,,即變量先定義后使用,。其實早在C90的時候,只允許函數(shù)定義完成之后,,緊接著將所有的變量都定義好然后再使用,,如圖4-4-1所示。一旦發(fā)現(xiàn)有在程序語句后面定義變量,,編譯器就會報錯,。典型的就是51單片機的編程語言KeilC51,它是基于C90開發(fā)的一套特殊的C語言,,因此相信大家做過51單片機的,,都遇到過這種莫名其妙的錯誤,如圖4-4-2所示,。這個問題是早期的K&R C就遺留下來的,。
                           

圖4-4-1 C90的變量定義

圖4-4-2 C51變量定義錯誤
 
而C99開始就已經(jīng)修改了這種別扭的設(shè)定,從此以后,,你可以在任何地方定義你想要定義的變量,,只要這個變量是在使用之前被定義的即可。如圖4-4-3所示,。

圖4-4-3 C99變量定義

但是,,最根本的原則不能變,即變量要在使用之前被定義,,如果先使用變量然后再定義變量,,編譯器就會報錯。如圖4-4-4所示,。

圖4-4-4 變量先使用后定義導(dǎo)致報錯
 
以上是變量定義時的詳細補充,,下面的內(nèi)容,我們將細致地討論以下內(nèi)容:
? 全局變量和局部變量,;
? 靜態(tài)變量和常變量,。
 
(1)全局變量和局部變量
定義在函數(shù)內(nèi)部的變量叫做局部變量,當(dāng)我們將這個變量定義完成之后,,即可以在當(dāng)前函數(shù)內(nèi)部使用,。而一旦函數(shù)被調(diào)用完成之后,局部變量將會被編譯器回收,,即只有在使用時才分配存儲空間的變量為局部變量,。如圖4-4-3中的“int a; int b; int c;”,都是局部變量,。為了說明定義在函數(shù)中的局部變量每次運行完成之后會被回收,,每次使用會被重新定義,,我們可以設(shè)計一個程序來說明這個現(xiàn)象。如圖4-4-5所示,。

圖4-4-5 局部變量驗證

圖4-4-5中,,我們定義了一個函數(shù)“LoacalVarPrint”,這個函數(shù)的主要功能是,,定義一個局部變量,,對其自加,然后打印出來,,而主函數(shù)寫了一個“for(;;)”的空循環(huán),,這個循環(huán)和“while(1)”等價,即不斷地調(diào)用而不退出,,在這個循環(huán)里面,,主函數(shù)不斷地調(diào)用“LoacalVarPrint”函數(shù),“Sleep(500)”的原型是Sleep(n),,它是Windows中的系統(tǒng)函數(shù)(API),,所以需要包含“windows.h”,其功能是延遲n毫秒,。主函數(shù)中還有一個不斷自加的變量,,每調(diào)用一次就對其自加。如果加設(shè)局部變量退出時是不會被回收,,重新調(diào)用函數(shù)時是不會被重新初始化,,那么“LoacalVarPrint”函數(shù)中的變量“var_to_watch”應(yīng)該被不斷地自加,但是現(xiàn)在查看程序的輸出結(jié)果,,它永遠為1,,也就是說,主函數(shù)每次調(diào)用函數(shù)時,,這個變量重新被初始化(定義變量缺省初始化時,,編譯器一般自動賦初值為0),然后自加1,,因此這個程序的輸出永遠為1,。退出這個循環(huán)程序使用“Ctrl + C”。
全局變量是指定義在函數(shù)外面的變量,,它其實有個默認的屬性,,即“靜態(tài)屬性”,所謂靜態(tài)屬性和下面所講的靜態(tài)變量類似,,一旦編譯器分配存儲空間給它便不會回收了,,它將永遠存在。
全局變量存在的形式有兩種。
如果是單個.c文件中定義的全局變量,,一般將其定義在程序的第一個函數(shù)之前,。因為全局變量也遵循“先定義后使用”的基本變量定義原則,因而如要被越多的函數(shù)使用到,,那就要定義在越多的函數(shù)前面,,因而定義在.c文件第一個函數(shù)之前。如圖4-4-6所示,。我們可以看到,,在main函數(shù)之前定義了全局變量,,每次在GlobalVarPrint函數(shù)中自加并且打印,,這個變量會一直保留著進行自加,并不會被重新初始化和回收釋放,。由于全局變量有這么好的特性,,因此我們需要用到一些系統(tǒng)狀態(tài)被工程中的其他函數(shù)讀寫,就可以使用全局變量來傳遞了,。

圖4-4-6 全局變量驗證

如果一個C語言工程項目中有多個文件,,在其中的一個文件中定義一個全局變量是其可以被其他.c文件中的函數(shù)讀寫,那么這個變量和函數(shù)一樣,,不僅需要定義,,還要在.h文件中被聲明,聲明全局變量用“extern”表示,。如圖4-4-7所示,。我們一共定義了四個文件,一個是main.c,,里面存放主函數(shù),,一個是increase.c里面實現(xiàn)了一個全局變量的自加,一個是increase.h,,這是increase.c的頭文件,,主要存放了函數(shù)和全局變量聲明,最后一個是它們的依賴文件Makefile,。

圖4-4-7 多文件全局變量定義和聲明
 
(2)靜態(tài)變量和常變量
靜態(tài)變量是一種用“static”關(guān)鍵詞聲明的變量,,它表示這個變量本身是一種靜態(tài)的變量,我們前面說了,,靜態(tài)屬性的變量,,其好處就是變量不會被編譯器回收釋放,而用“static”關(guān)鍵詞聲明的變量不僅能做全局變量,,也能做局部變量,,做局部變量時,它在函數(shù)執(zhí)行完成之后也不會被編譯器回收。
靜態(tài)變量的定義方式為:static 變量類型變量名;
可能現(xiàn)在大家就有疑問了,,靜態(tài)變量的這種功能豈不是和全局變量一樣了,?為什么還要再單獨弄個靜態(tài)變量?這真是多此一舉,??墒沁@真的是多次一舉嗎?
這里大家要注意,,在C語言中,,所有用“static”關(guān)鍵詞修飾靜態(tài)類型都有一個共同的特征,即不能放在.h文件中聲明,。這一個看似沒啥用的特征卻對C語言這種簡單語言起了很大的作用,,即使用static修飾的變量和函數(shù),可以作為每個獨立.c源文件的私有變量和函數(shù),。私有變量和函數(shù)就意味著,,當(dāng)我們將一個功能模塊里面的函數(shù)和變量定義好之后,又不想被調(diào)用者隨便更改而造成某些問題,,那我們就可以使用私有函數(shù)和變量,,僅供內(nèi)部調(diào)用。而從C++以后的語言都增加了“private,,public,,protect”關(guān)鍵詞來表示變量的權(quán)限。如圖4-4-8所示,,我們將圖4-4-7代碼中的GlobalIncNum全局變量靜態(tài)化聲明,,并且在.h文件中聲明它,結(jié)果編譯器就拋出異常,。

圖4-4-8 靜態(tài)變量聲明報錯
 
而圖4-4-9中,,我們“大膽”地定義了兩個變量名完全相同的變量,并且都用static關(guān)鍵詞做靜態(tài)化修飾,。main.c函數(shù)中的GlobalIncNum變量做自減,,而increase.c中的GlobalIncNum變量做自加,結(jié)果發(fā)現(xiàn)編譯正常通過,,而且在main函數(shù)中輸出的是其自己文件中定義的GlobalIncNum變量,,因為這個變量是自減的。當(dāng)然,,你也可以在GlobalVarIncrease()函數(shù)中也將GlobalIncNum變量打印出來,,看看有什么現(xiàn)象。

圖4-4-9靜態(tài)修飾變私有化
 
static修飾的靜態(tài)變量還有一個功能,,即它在函數(shù)退出時不會被編譯器回收,。如圖4-4-10所示,在函數(shù)中,將局部變量靜態(tài)化,,那么它每次在函數(shù)結(jié)束調(diào)用后也不會被回收了,。

圖4-4-10 靜態(tài)變量不會被編譯器回收
 
C語言中const關(guān)鍵字是constant的縮寫,它的意思是常量,、常數(shù)等,。C語言中const功能很強大。這里我們先說明它用來修飾變量時候的用法,。Const關(guān)鍵詞修飾變量的用法為:const 數(shù)據(jù)類型變量名,。如“const intnumber = 5;”這就表面,定義了一個常變量,,變量名為number,,值為5。而在程序任何地方都不能修改number的值,,因為無論你怎么修改,,這個程序都編譯不過,。如圖4-4-11所示,。

圖4-4-11 const變量非法修改

其實const修飾的常變量有點類似于只讀變量的意思,事實上編譯器處理這些變量的時候,,都是將其直接編譯進程序的代碼里,,而不作為數(shù)據(jù)來用,這么說可能做PC端開發(fā)的讀者不明白,。如果你用哈佛結(jié)構(gòu)的計算機,,如絕大多數(shù)單片機,你會知道,,它們的程序和數(shù)據(jù)是分別存在兩個不同的存儲器上面的一個類似于PC的硬盤,,一個類似于內(nèi)存。不同的是哈佛架構(gòu)的計算機,,程序直接可以在硬盤里面運行,,不需要像馮諾依曼架構(gòu)計算機一樣,拷貝到內(nèi)存上,,而運行過程中的數(shù)據(jù)(如一般變量)是存放在數(shù)據(jù)存儲器上的,。而如果用const關(guān)鍵詞修飾的常變量,編譯器會將它直接放到程序存儲器里面,,因為它是只讀的,。



    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多