管瑜琳
全局變量具有全局作用域。全局變量只需在一個(gè)源文件中定義,就可以作用于所有的源文件。利用全局變量的特性,可以進(jìn)行自動(dòng)讀題,然后根據(jù)預(yù)置答案,從答案中進(jìn)行正確挑選,自動(dòng)進(jìn)行人機(jī)對(duì)話。
【關(guān)鍵詞】全局變量 存儲(chǔ)區(qū)域 應(yīng)用淺析
自動(dòng)回答題庫中的問題,在沒有人工智能AlphaGo的情況下,是否可以實(shí)現(xiàn)?答案顯然是有可能的。
在沒有超級(jí)計(jì)算機(jī),沒有云計(jì)算,沒有云數(shù)據(jù)的前提下,我們完全可以利用個(gè)人電腦,利用全局變量的特性,進(jìn)行自動(dòng)讀題,然后根據(jù)預(yù)置答案,從答案中進(jìn)行正確挑選,實(shí)現(xiàn)偽人工智能。
1 變量定義及存儲(chǔ)區(qū)域
在程序語言中,對(duì)于基本數(shù)據(jù)類型量,按其值是否可變又分為常量和變量兩種。變量按作用域范圍又可分為兩種:局部變量和全局變量。除此以外,變量還有外部變量、內(nèi)部變量、靜態(tài)變量以及動(dòng)態(tài)變量等這些叫法。
在這里,我們只是對(duì)這些變量進(jìn)行簡單的定義闡述,并區(qū)分變量各自的存儲(chǔ)區(qū)域,并著重說明全局變量的一些特殊應(yīng)用。
1.1 變量定義
常量——在程序執(zhí)行過程中,其值不能改變的量。常量可以直接用1個(gè)數(shù)來表示,稱為常數(shù)(或稱為直接常量)。
變量——在程序執(zhí)行過程中,其值可以改變的量。
局部變量——Local Variable,也稱為內(nèi)部變量,定義在函數(shù)內(nèi)部,它的作用域僅限于函數(shù)內(nèi), 離開該函數(shù)后再使用就是錯(cuò)誤的。
全局變量——Global Variable,也稱為外部變量,定義在所有函數(shù)外部,它的作用域是整個(gè)源程序。
靜態(tài)變量——就是在定義的時(shí)候,有static 修飾的變量。
動(dòng)態(tài)變量——在程序執(zhí)行過程中建立,隨函數(shù)的調(diào)用動(dòng)態(tài)分配存儲(chǔ)空間,調(diào)用結(jié)束,釋放空間。
這么多變量,其實(shí)各種名稱都是相對(duì)的,例如:常量與變量,局部變量與全局變量,都是從不同的角度而言。
1.2 變量的作用域
全局變量具有全局作用域。全局變量只需在一個(gè)源文件中定義,就可以作用于所有的源文件。當(dāng)然,其他不包含全局變量定義的源文件需要用extern 關(guān)鍵字再次聲明這個(gè)全局變量。
靜態(tài)局部變量具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運(yùn)行結(jié)束都一直存在,它和全局變量的區(qū)別在于全局變量對(duì)所有的函數(shù)都是可見的,而靜態(tài)局部變量只對(duì)定義自己的函數(shù)體始終可見。
局部變量也只有局部作用域,它在程序運(yùn)行期間不是一直存在,而是只在函數(shù)執(zhí)行期間存在,函數(shù)的一次調(diào)用執(zhí)行結(jié)束后,變量被撤銷,其所占用的內(nèi)存也被收回。
靜態(tài)全局變量也具有全局作用域,它與全局變量的區(qū)別在于如果程序包含多個(gè)文件的話,它作用于定義它的文件里,不能作用到其它文件里,即被static關(guān)鍵字修飾過的變量具有文件作用域。這樣即使兩個(gè)不同的源文件都定義了相同名字的靜態(tài)全局變量,它們也是不同的變量。
1.3 變量的存儲(chǔ)區(qū)域
用戶存儲(chǔ)空間可以分為三個(gè)部分:程序區(qū)、靜態(tài)存儲(chǔ)區(qū)、動(dòng)態(tài)存儲(chǔ)區(qū)。因此從另一個(gè)角度而言,從變量值存在的作時(shí)間(即生存期)角度來分,變量又可以分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。
靜態(tài)存儲(chǔ)方式:是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。
動(dòng)態(tài)存儲(chǔ)方式:是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。
全局變量、靜態(tài)局部變量、靜態(tài)全局變量全部都在靜態(tài)存儲(chǔ)區(qū)分配空間,在程序開始執(zhí)行時(shí)給全局變量分配存儲(chǔ)區(qū),程序行完畢就釋放。在整個(gè)程序執(zhí)行過程中,它們占據(jù)固定的存儲(chǔ)單元,而不進(jìn)行動(dòng)態(tài)的分配和釋放。
局部變量、動(dòng)態(tài)變量在動(dòng)態(tài)存儲(chǔ)區(qū)分配空間。除此以外,動(dòng)態(tài)存儲(chǔ)區(qū)還存放以下數(shù)據(jù):動(dòng)態(tài)申請(qǐng)的變量,函數(shù)形式參數(shù),函數(shù)調(diào)用實(shí)的現(xiàn)場保護(hù)和返回地址等,即通常工程師平常提到的“堆”和“?!保ǘ押蜅J欠謩e指向不同的區(qū)域)。
2 全局變量應(yīng)用淺析
從定義、作用域和存儲(chǔ)區(qū)域等方面進(jìn)行了各種闡述,可以得出以下幾個(gè)結(jié)論:
(1)動(dòng)態(tài)變量由于分配的時(shí)間、次序不同,而導(dǎo)致地址也很有可能不同。
(2)局部變量的地址是跟其作用域相關(guān)的函數(shù)有關(guān),因此地址可以說是固定的。
(3)靜態(tài)存儲(chǔ)方式的全局變量、靜態(tài)全局變量、靜態(tài)局部變量,其地址都是在編譯過程中就為其分配好了。只要bin(這個(gè)bin是泛稱,即軟件項(xiàng)目工程最終編譯生成目標(biāo),有可能是exe執(zhí)行程序,也有可能是一個(gè)單片機(jī)的二進(jìn)制文件,與最終后綴名無關(guān))不變,其地址就不會(huì)改變。甚至可以說,庫不變,庫中的靜態(tài)存儲(chǔ)方式的全局變量也不會(huì)發(fā)生變更。
說了這么多,其實(shí)就是讓大家明白一點(diǎn):在一個(gè)正式發(fā)布的應(yīng)用程序再次升級(jí)前,這個(gè)應(yīng)用程序中的靜態(tài)存儲(chǔ)方式的全局變量、靜態(tài)全局變量、靜態(tài)局部變量(下文簡單點(diǎn)只說全局變量),其地址是固定不變的,不會(huì)每次運(yùn)行得到不同的值(當(dāng)然這個(gè)地址是針對(duì)其所在的Task而言)。因此,如果我們得到程序某個(gè)全局變量的地址,以后可以直接對(duì)這個(gè)地址進(jìn)行操作,這個(gè)地址在應(yīng)用程序升級(jí)。
知道了全局變量是固定的地址,那么會(huì)有什么信息是用全局變量的?
軟件開發(fā)者為了開發(fā)方便,有時(shí)會(huì)定義全局變量以方便使用。比如在游戲中常會(huì)出現(xiàn)的人機(jī)對(duì)話頁面,那么怎樣才能自動(dòng)讀題,自動(dòng)作答呢?
人機(jī)界面對(duì)話的題庫內(nèi)容肯定是個(gè)常量,但是在顯示時(shí)有可能會(huì)將內(nèi)容復(fù)制到一個(gè)全局變量的buffer中,甚至標(biāo)準(zhǔn)答案可能也是固定地址。那我們可以通過人機(jī)對(duì)話對(duì)話框的固定地址來解析具體是題庫中的哪個(gè)問題,甚至將ABCD選項(xiàng)和標(biāo)準(zhǔn)答案進(jìn)行內(nèi)容匹配來判斷最終正確的選項(xiàng)是哪個(gè)。這樣的情況下,只要一出現(xiàn)人機(jī)對(duì)話,就可以知道問道問題是題庫中的哪一個(gè),然后回答中的選項(xiàng)與標(biāo)準(zhǔn)答案進(jìn)行比對(duì),自動(dòng)進(jìn)行人機(jī)對(duì)話應(yīng)答。
3 結(jié)束語
在大型程序的開發(fā)過程中,數(shù)據(jù)共享問題是一個(gè)復(fù)雜的綜合性問題,在開發(fā)之前,合理的定義全局變量的函數(shù)名和定義,能夠有效的提高讀寫效率,減少由于實(shí)際參數(shù)和形式參數(shù)的數(shù)據(jù)傳遞帶來的時(shí)間消耗。
參考文獻(xiàn)
[1]譚浩強(qiáng).C語音程序設(shè)計(jì)(第一版)[M].北京:清華大學(xué)出版社,2004.
作者單位
上海飛機(jī)設(shè)計(jì)研究院綜合航電系統(tǒng)研究部 上海市 201210