變量是一個(gè)內(nèi)存單元的命名以及對(duì)應(yīng)的一段比特的編碼和解碼,涉及到數(shù)據(jù)類(lèi)型、存儲(chǔ)屬性。 變量的數(shù)據(jù)類(lèi)型是所有編程語(yǔ)言都需要考慮的語(yǔ)法特征。區(qū)別在于數(shù)據(jù)類(lèi)型檢查與推斷是發(fā)生在編譯期還是運(yùn)行期,前者特性的編程語(yǔ)言一般稱(chēng)為靜態(tài)類(lèi)型語(yǔ)言,后者特性的編程語(yǔ)言一般稱(chēng)之為動(dòng)態(tài)類(lèi)型語(yǔ)言。 靜態(tài)類(lèi)型編程語(yǔ)言一般要求在編譯期檢查類(lèi)型的安全性,可以實(shí)現(xiàn)錯(cuò)誤的早期發(fā)現(xiàn)機(jī)制,一定程度上提高了程序的嚴(yán)謹(jǐn)性,代碼的健壯性和運(yùn)行的效率,為此對(duì)于變量的要求是先聲明后使用。靜態(tài)的語(yǔ)義解釋可以以空間換時(shí)間,可以有靜態(tài)優(yōu)化。 1 數(shù)據(jù)類(lèi)型的表達(dá)規(guī)則數(shù)據(jù)類(lèi)型的表達(dá)規(guī)則包括內(nèi)存布局與格式的內(nèi)存表達(dá),使用內(nèi)存單元的字節(jié)(byte)數(shù)量,以及編碼和解碼規(guī)則,同時(shí)也確定了數(shù)據(jù)類(lèi)型的值域。 對(duì)于自定義類(lèi)型,其數(shù)據(jù)成員在內(nèi)存中連續(xù)存儲(chǔ),并按內(nèi)存對(duì)齊規(guī)則進(jìn)行對(duì)齊。 2 數(shù)據(jù)類(lèi)型的操作規(guī)則基本數(shù)據(jù)類(lèi)型的操作規(guī)則通過(guò)上下文的操作符來(lái)定義,操作符也相當(dāng)于一個(gè)特殊的函數(shù),操作符有一元操作符、二元操作符和三元操作符,相當(dāng)于特殊函數(shù)的參數(shù)數(shù)量。 2.1 算子(操作數(shù)); 2.2 溢出規(guī)則; 2.3 異常處理規(guī)則; 對(duì)于自定義類(lèi)型,操作規(guī)則由成員函數(shù)來(lái)定義,或者重載操作符(也是特殊的成員函數(shù))來(lái)定義。 3 數(shù)據(jù)類(lèi)型的轉(zhuǎn)換規(guī)則當(dāng)聲明、定義和初始化了一個(gè)變量時(shí),也就是對(duì)其值按類(lèi)型規(guī)則進(jìn)行編碼并對(duì)內(nèi)存的比特進(jìn)行初始化后,該比特串就可以按編碼規(guī)則解碼為對(duì)應(yīng)類(lèi)型的數(shù)據(jù),如果想解碼為其他類(lèi)型,也就是所謂的類(lèi)型轉(zhuǎn)換,C++編譯器必須定義相應(yīng)的轉(zhuǎn)換規(guī)則,如浮點(diǎn)數(shù)轉(zhuǎn)換成整數(shù)的小數(shù)點(diǎn)舍去規(guī)則等。 包括C風(fēng)格的強(qiáng)制類(lèi)型轉(zhuǎn)換,C++的static_cast、dynamic_cast、reinterpret_cast。 4 模板支持C++支持函數(shù)模板和類(lèi)模板來(lái)實(shí)現(xiàn)數(shù)據(jù)類(lèi)型的泛化,函數(shù)模板調(diào)用時(shí),可以進(jìn)行自動(dòng)類(lèi)型推斷。而類(lèi)模板需要使用基本類(lèi)型進(jìn)行類(lèi)的實(shí)例化。 5 變量的存儲(chǔ)屬性和作用域、生命期、鏈接性在C++中,程序可以是多文件程序,先編譯,后鏈接,所以對(duì)于跨文件引用的全局變量,需要先用關(guān)鍵字extern聲明,告訴編譯期,這是一個(gè)在別外定義的全局變量。如果某一全局變量不想被跨文件使用,可以用static來(lái)修飾,限定其不能跨文件引用。在C++中,static除了空間使用(也就是鏈接性)的上下文,還有時(shí)間上的上下文,可以修飾為靜態(tài)變量,其生命期從聲明位置開(kāi)始,一直延續(xù)到程序結(jié)束。 復(fù)合語(yǔ)句(或塊,包括函數(shù)語(yǔ)句塊)內(nèi)定義的變量稱(chēng)為局部變量,其作用域與生命期從聲明和定義位置開(kāi)始,到語(yǔ)句塊結(jié)束位置結(jié)束。局部變量在棧內(nèi)存區(qū)分配空間 復(fù)合語(yǔ)句(或塊,包括函數(shù)語(yǔ)句塊)外定義的變量稱(chēng)為全局變量,其作用域與生命期從聲明和定義位置開(kāi)始,到程序結(jié)束時(shí)結(jié)束(也就是main函數(shù)結(jié)束時(shí))。全局變量根據(jù)是否有初始化而分配在內(nèi)存的全局\靜態(tài)數(shù)據(jù)區(qū)的數(shù)據(jù)段和BSS段。 在C++中,可以在程序運(yùn)行期申請(qǐng)堆內(nèi)存,這樣的變量稱(chēng)為動(dòng)態(tài)變量,一般使用指針申請(qǐng),申請(qǐng)使用完后需手工釋放堆內(nèi)存,釋放內(nèi)存的操作并沒(méi)有改變?cè)兄羔樀闹赶颍瑸榱吮苊忮e(cuò)誤,建議的做法是將指針更新為NULL。 所以存儲(chǔ)屬性及在內(nèi)存中的區(qū)域與變量聲明和定義時(shí)使用的存儲(chǔ)屬性關(guān)鍵字和聲明的位置有關(guān)。 6 變量的類(lèi)型修正符modifier在C++中,變量的聲明和定義除了使用存儲(chǔ)屬性關(guān)鍵字、類(lèi)型聲明以外,還可以使用類(lèi)型修正符,對(duì)原型進(jìn)行一些修改和限制。 C++使用const、volatile和mutable三個(gè)類(lèi)型修正符。 7 變量的聲明與定義在C++中,變量定義時(shí)要求聲明數(shù)據(jù)類(lèi)型,會(huì)分配內(nèi)存空間,所以變量的定義同時(shí)也是聲明。在C++中單獨(dú)的聲明只有使用extern的情形,如extern int var;分兩種情況,一是extern int var;處于局部作用域,但在此后的全局作用域中,有var定義:int var; 另外一種情形是extern int var;聲明在全局作用域中,表示在其它文件的全局作用域中有int var;的定義。另外,對(duì)于函數(shù)的形參,也可以理解為一種函數(shù)參數(shù)局部作用域的聲明。 需要注意的是,自定義的結(jié)構(gòu)類(lèi)型也有聲明與定義,如類(lèi)類(lèi)型,當(dāng)涉及到類(lèi)A的數(shù)據(jù)成員有類(lèi)B的變量,當(dāng)類(lèi)B未定義時(shí),可以先聲明類(lèi)B,再定義類(lèi)A和類(lèi)B。此后便可以聲明和定義類(lèi)A或類(lèi)B的變量(或稱(chēng)為實(shí)例、對(duì)象)。 8 變量的值語(yǔ)義變量的地址屬性和值屬性可以理解為左值和右值。 變量的值語(yǔ)義可以做為函數(shù)的形參與實(shí)參,作為函數(shù)的函數(shù)返回值。當(dāng)形參用實(shí)參來(lái)初始化,函數(shù)返回指定類(lèi)型時(shí),可能存在隱式類(lèi)型轉(zhuǎn)換。 值語(yǔ)義用于函數(shù)的入?yún)⒑头祷刂悼赡茉斐纱罅康呐R時(shí)變量和冗余拷貝。 9 變量的自洽性變量的自洽性是指變量的生命周期是獨(dú)立的、可控的、不受外部環(huán)境影響的。因此自洽的變量很容易被持久化。 一個(gè)變量的自洽性滿(mǎn)足下列的四個(gè)條件 9.1 具有值語(yǔ)義; 9.2 具有獨(dú)立的生命周期; 9.3 可以輕易地被持久化; 9.4 可以在不同的系統(tǒng)中等價(jià)地存在; 10 變量的總分性變量的總分性是指一個(gè)變量不僅是獨(dú)立的變量,還是其他變量的成員變量,如結(jié)構(gòu)體和類(lèi)類(lèi)型的變量與其成員變量。 11 變量的多態(tài)性基類(lèi)指針變量的多態(tài)性,用于類(lèi)在繼承關(guān)系中的虛函數(shù)的動(dòng)態(tài)重載。 12 臨時(shí)變量在計(jì)算機(jī)程序的計(jì)算過(guò)程中,中間結(jié)果往往是由臨時(shí)變量來(lái)存儲(chǔ)的。 字符串字面量做右值時(shí)也會(huì)產(chǎn)生一個(gè)臨時(shí)變量。 函數(shù)是可以將臨時(shí)變量的值作為返回值的,同時(shí),在類(lèi)類(lèi)型中重載賦值運(yùn)算符后使用賦值運(yùn)算符時(shí),右值會(huì)產(chǎn)生一個(gè)臨時(shí)對(duì)象。 -End- |
|
來(lái)自: thchen0103 > 《科學(xué)●工程●技術(shù)》