變量的定義與聲明_第1頁(yè)
變量的定義與聲明_第2頁(yè)
變量的定義與聲明_第3頁(yè)
變量的定義與聲明_第4頁(yè)
變量的定義與聲明_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

變量的定義從前面的章節(jié)可以看出,程序中所有的東西幾乎都有名字。然而字面量卻是個(gè)例外,它沒(méi)有名字。那么使用變量,我們就可以為某個(gè)值取名字了。實(shí)際上,我們是為系統(tǒng)內(nèi)存中用于保存數(shù)據(jù)的某塊空間取名字。ANSIC規(guī)定:變量必須“先定義、后使用”,因此當(dāng)用C定義變量時(shí),不僅需要指定變量名,而且還必須告訴編譯器其存儲(chǔ)的數(shù)據(jù)類型,變量類型告訴編譯器應(yīng)該在內(nèi)存中為變量名分配多大的存儲(chǔ)單元,用來(lái)存放相應(yīng)變量的值(變量值),而變量?jī)H僅是存儲(chǔ)單元的別名,供變量使用的最小存儲(chǔ)單元是字節(jié)(Byte)。由此可見(jiàn),每個(gè)變量都占據(jù)一個(gè)特定的位置,每個(gè)存儲(chǔ)單元的位置都由“地址”唯一確定并引用,就像一條街道上的房子由它們的門牌號(hào)碼標(biāo)識(shí)一樣。即從變量中取值就是通過(guò)變量名找到相應(yīng)的存儲(chǔ)地址,然后讀取該存儲(chǔ)單元中的值,而寫一個(gè)變量就是將變量的值存放到與之相應(yīng)的存儲(chǔ)地址中去。由于變量的定義不是可執(zhí)行代碼,因此要求局部變量的定義必須位于用“{}包圍的程序塊”的開頭,即在可執(zhí)行代碼的前面。比如:intlower_limit=80; //定義lower_limit為整型變量即在定義lower_limit為int類型數(shù)據(jù)時(shí),系統(tǒng)就已經(jīng)為變量lower_limit分配了存儲(chǔ)單元。請(qǐng)注意區(qū)分變量名和變量值這兩個(gè)不同的概念,其中,lower_limit為變量名,80為變量lower_limit的值,即存放在變量lower_limit的存儲(chǔ)單元中的數(shù)據(jù)。那么到底如何獲得變量的地址呢?C語(yǔ)言使用“&(地址運(yùn)算符)加變量名”的方式獲取變量的地址,比如,&lower_limit就代表變量lower_limit的地址,詳見(jiàn)后續(xù)相關(guān)章節(jié)的描述。一個(gè)定義只能指定一種變量類型,雖然后面所帶的變量表可以包含一個(gè)或多個(gè)該類型的變量:intlower_limit,upper_limit,sum;但如果將一個(gè)定義語(yǔ)句中的多個(gè)變量拆開在多個(gè)定義語(yǔ)句中定義的話:intlower_limit;//lower_limit為數(shù)據(jù)下限intupper_limit;//upper_limit為數(shù)據(jù)上限intsum;//sum為求和的結(jié)果則可在各個(gè)定義語(yǔ)句中添加注釋,則大大提高了程序的可閱讀性,而且修改起來(lái)更加方便,但C編譯器會(huì)忽略在每行右邊用于描述變量用途的注釋語(yǔ)句。與此同時(shí)還可以在定義中,對(duì)變量進(jìn)行初始化,即允許在變量名的后面緊跟一個(gè)等號(hào)以及一個(gè)表達(dá)式。intlower_limit=1;intupper_limit=lower_limit+50;intsum;外部變量的聲明由于變量lower_limit是在別的文件中定義的,那么只要在引用之前用關(guān)鍵字extern對(duì)該變量作“外部變量聲明”即可,無(wú)需再為變量lower_limit分配存儲(chǔ)單元,這種情況稱之為聲明或引用性聲明。比如:externintlower_limit; //將已定義的外部變量lower_limit的作用域擴(kuò)展到此在這里將extern置于變量前,就是為了告訴編譯器變量lower_limit這個(gè)名字已經(jīng)在別的文件中被定義了,因此遇到此變量時(shí),需在其它模塊中尋找與之相應(yīng)的定義。有時(shí)程序是由多個(gè)源程序文件組成的,那么只需要在其中任一個(gè)文件中定義外部變量lower_limit,而在另一個(gè)文件中用extern對(duì)變量lower_limit作“外部變量聲明”,即可將外部變量的作用域擴(kuò)展到其它文件。當(dāng)extern用于聲明外部變量時(shí),則類型名可寫也可不寫,由于聲明變量不是定義變量,,則可以不指定類型,只需寫出變量名即可。比如:externlower_limit;注意:extern不僅可用于聲明變量,而且還可以用于聲明數(shù)組和指針,以及用于聲明外部函數(shù),詳見(jiàn)后續(xù)相關(guān)章節(jié)的描述。靜態(tài)變量的定義當(dāng)用static修飾變量時(shí),則全局變量與局部變量都保存在內(nèi)存的靜態(tài)區(qū)。即便函數(shù)運(yùn)行結(jié)束,而靜態(tài)變量的值都不會(huì)被銷毀,以后仍然還可以繼續(xù)使用。(1)靜態(tài)全局(外部)變量當(dāng)static用于定義外部變量時(shí),則變量?jī)H被所定義的文件使用,而其它文件則無(wú)法使用它。比如:staticunsignedchar __GucTask0; //任務(wù)0測(cè)試變量使用靜態(tài)全局變量的好處就是在進(jìn)行模塊化程序開發(fā)時(shí),不用擔(dān)心外部變量名的沖突,只需在每個(gè)文件中定義全局變量時(shí)加上static即可。(2)靜態(tài)局部變量靜態(tài)局部變量則是在函數(shù)體內(nèi)定義的,那么只能在這個(gè)函數(shù)中使用。注意:static還可以用于修飾函數(shù),如果在函數(shù)前加static,則該函數(shù)只能成為被本文件中的其它函數(shù)所調(diào)用的靜態(tài)函數(shù)(內(nèi)部函數(shù)),其好處就是不用擔(dān)心函數(shù)名的沖突,便于模塊化開發(fā),詳見(jiàn)后續(xù)相關(guān)章節(jié)的描述。后記:任何一本教材都有一定的側(cè)重點(diǎn)和面向的讀者群,本教材是為“高等學(xué)校電類專業(yè)新概念教材.卓越工程師教育叢書”而寫作的配套圖書,適當(dāng)?shù)擞?jì)算機(jī)應(yīng)用軟件的編程,重點(diǎn)強(qiáng)化了嵌入式系統(tǒng)應(yīng)用中的程序設(shè)計(jì),并將后續(xù)教材中與常用算法以及嵌入式操作系統(tǒng)微小內(nèi)核關(guān)聯(lián)較大的內(nèi)容提前作了鋪墊,為初學(xué)者讀懂《項(xiàng)目驅(qū)動(dòng)——單片機(jī)應(yīng)用設(shè)計(jì)基礎(chǔ)》教材中的TingOS51操作系統(tǒng)微小內(nèi)核源代碼,并最終獨(dú)立寫出一個(gè)屬于自己的基于32位Cortex-M0核的嵌入式操作系統(tǒng)MiCOS(《ARM嵌入式系統(tǒng)初級(jí)教程(基于Cortex-M0)》教材的最后一章僅詳細(xì)地介紹了一個(gè)微小內(nèi)核的設(shè)計(jì)思想,但未給出源代碼,要求初學(xué)者自己完成)打下扎實(shí)基礎(chǔ)。雖然過(guò)來(lái)人常常告訴初學(xué)者,學(xué)習(xí)程序設(shè)計(jì)一定多閱讀經(jīng)典程序,一定要多上機(jī)編程,但總不見(jiàn)他們“多”起來(lái),90%以上的大學(xué)生卻感到寫程序是一件非常痛苦的事情,以至于對(duì)所學(xué)的專業(yè)沒(méi)有絲毫的興趣。而大多數(shù)人普遍缺乏閱讀源代碼的方法和耐心,說(shuō)句實(shí)在話,連“書(即程序的設(shè)計(jì)思想)”都沒(méi)有“真正地”看懂(想一想什么是“真正地”?),那又怎么會(huì)編程呢?雖然大凡高手都是“山寨”過(guò)來(lái)的,但要“山寨”出水平來(lái)卻不是一件容易的事情。其實(shí)并不難,關(guān)鍵是方法出了問(wèn)題,我們都是“凡人”,不要與那些“聰明人”相比,我們應(yīng)該下點(diǎn)苦功夫,用點(diǎn)土辦法,踏踏實(shí)實(shí)地賣苦力,肯定會(huì)有所突破,我將另行撰文作經(jīng)驗(yàn)介紹。其實(shí)剛開始我也沒(méi)有搞清楚“聲明與定義”的概念和含義,只會(huì)編程搞得我云里霧里,到底有沒(méi)有辦法搞清楚?其實(shí)“定義”不僅說(shuō)明了保存的數(shù)據(jù)類型,而且還為變量分配了空間,即變量所占的字節(jié)數(shù),那么你不妨寫一段程序,看看與之對(duì)應(yīng)的匯編代碼便知道了。由此可見(jiàn),“聲明”一個(gè)常量其實(shí)也是“定義”,比如,“constintwidth=80;”,因?yàn)橄到y(tǒng)為width分配了一個(gè)與之對(duì)應(yīng)的存儲(chǔ)單元。暫時(shí)沒(méi)有搞清楚沒(méi)有關(guān)系,但一定不能放過(guò)?。。‰m然很多人閱讀過(guò)K/OS-II操作系統(tǒng)的源代碼,可到頭來(lái)還是不會(huì)寫一個(gè)簡(jiǎn)單的OS,即便有些人很認(rèn)真地“寫”了一個(gè),但實(shí)際上卻是“抄”來(lái)的,為什么?很多人想要通過(guò)修改,期望搞出一點(diǎn)“不一樣”的意思出來(lái)卻非常困難。我認(rèn)為,當(dāng)初學(xué)者只有具備了一定的基礎(chǔ)之后,才有成為高手的興趣和可能,這就是作者的教學(xué)思想和出發(fā)點(diǎn)。常變量的聲明為了提高程序的可閱讀性與可維護(hù)性,ANSIC允許用戶命名常量(namedconstant,聲明為const的變量)。當(dāng)它被初始化之后,它的值便不能改變。ANSIC規(guī)定:可以使用const關(guān)鍵字聲明常量,修飾符const可以用在類型說(shuō)明符前,也可以用在類型說(shuō)明符后。比如:intconstMAX_LENGTH=78; //命名常變量的最佳方式是使用大寫字母constintMAX_LENGTH=78; //MAX_LENGTH的初值為78雖然const修飾的值是常量,而實(shí)際上MAX_LENGTH卻是一個(gè)只讀變量。通過(guò)匯編代碼可以看出,編譯器僅僅給出了MAX_LENGTH變量對(duì)應(yīng)的內(nèi)存地址,卻并沒(méi)有為MAX_LENGTH變量分配存儲(chǔ)空間,而是將其保存在符號(hào)表中,編譯器在編譯時(shí)直接進(jìn)行“替換”優(yōu)化。*注意:const除了可以修飾只讀變量之外,還可以用于修飾數(shù)組、指針、函數(shù)的參數(shù)與函數(shù)的返回值,詳見(jiàn)后續(xù)相關(guān)章節(jié)的描述。5.標(biāo)識(shí)符ANSIC規(guī)定標(biāo)識(shí)符只能由字母、數(shù)字和下劃線3種字符組成,且第1個(gè)字符必須為字母或下劃線。比如:__GucTask0*注意:C是區(qū)分大小寫字母的語(yǔ)言,也就是說(shuō),由相同字母組成的字符,如果大小寫不同,就會(huì)被看做不同的字符。比如,命名age與sum的變量與Age或AGE以及Sum的變量就是不同的變量。一般來(lái)說(shuō),變量名常用小寫字母來(lái)表示,比較符合人們的閱讀習(xí)慣。雖然ANSIC并沒(méi)有規(guī)定標(biāo)識(shí)符的長(zhǎng)度,但各個(gè)編譯器都有自己的規(guī)定,比如,TurboC則允許變量名最多不超過(guò)32個(gè)字母。關(guān)鍵知識(shí)點(diǎn):變量的聲明與定義廣義地說(shuō),聲明包含定義,但并非所有的聲明都是定義。對(duì)于“intlower_limit;”來(lái)說(shuō),它既是聲明又是定義;而對(duì)“externlower_limit;”來(lái)說(shuō),它是聲明不是定義。“聲明”僅僅告訴編譯器變量名的值的類型而已,不會(huì)生成目標(biāo)代碼,當(dāng)然也不會(huì)給它分配存儲(chǔ)空間,更不會(huì)增大可執(zhí)行程序的體積。由于聲明并不分配存儲(chǔ)空間,因此同一個(gè)聲

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論