詳析c#中的變量_第1頁
詳析c#中的變量_第2頁
詳析c#中的變量_第3頁
詳析c#中的變量_第4頁
詳析c#中的變量_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、5.變量5.1變量類型5.1.1靜態(tài)變量5.1.2實例變量5.1.3數(shù)組元素5.1.4數(shù)值參數(shù)5.1.5引用參數(shù)5.1.6輸出參數(shù)5.1.7局部變量5.2默認值5.3明確賦值5.3.1初始賦值變量5.3.2非初始賦值變量5.4變量引用變量變量代表數(shù)據(jù)的實際存儲位置。每各變量所能存儲的數(shù)值由它本身的類型決定。C + +語言是一種類型安全語言(type safe Ianguage , TSL ),而且C + +編譯器保證每一個數(shù)值被保存在相應 的變量中。變量的數(shù)值可以通過賦值或者+或-運算符改變。在變量被賦值以前,變量自身的類型必須被明確地聲明。在下面的章節(jié)中我們會提到,變量或者被初始化的或者未初

2、始化的。一個初始化的變量在被定義時被賦予了一個確定的初始值,而未初始化的變量在定義時并未被賦予確定的初始值。對于一個在程序某處被認為具有確定數(shù)值的IUA,必然在指向這一位置的所有可能的執(zhí)行路徑上存在賦值操作5.1 變量類型C + +共有七種變量類型:靜態(tài)變量,實例變量,數(shù)組元素,數(shù)值參數(shù),引用參數(shù),輸岀參數(shù)和局部變量。下面的部分將分別對每一種變量類型做相關描述。例子:class Apublic static int x;int y;void F(int v, int a, ref int b, out int c) int i=1;c=a+b+;x是一個靜態(tài)變量,y是一個實例變量,v0是一個數(shù)

3、組元素,a是數(shù)值參數(shù),b是引用參數(shù),一個輸岀參數(shù),i是一個局部變量。5.1.1 靜態(tài)變量使用 static 修飾符定義的變量稱為靜態(tài)變量。靜態(tài)變量在被創(chuàng)建并加載后生效,當被卸載后失效。靜態(tài)變量的初始值為此類型變量的默認值(參見 錯誤!未找到引用源。 節(jié))。 為了方便明確賦值檢查,靜態(tài)變量被認為是初始化過的。5.1.2 實例變量一個沒有 static 修飾符聲明的域被稱為實例變量。類中的實例變量當創(chuàng)建某類的一個實例的時候, 隸屬于該類的實例變量也被生成,當不再有關于這個實 例的引用而且實例的析構函數(shù)執(zhí)行了以后,此實例變量失效。類中實例變量的初始值為 這種類型變量的默認值( 5.2 )。為了方便進

4、行明確賦值檢查,類中的實例變量是初始 化過的。結構體中的實例變量一個結構體中的實例變量與隸屬與該結構體的結構體變量壽命相同。換句話說,結 構體中的實例變量和其中的其他變量一樣被同時創(chuàng)建,并且同時失效。 而且該結構體中 的實例變量的初始賦值狀態(tài)和其中的其余變量一致。 當一個結構體變量被是初始化過的 , 結構體的實例變量也是如此;反之如果一個結構體變量是未經(jīng)初始化的時 , 結構體的實 例變量也是未經(jīng)初始化的。5.1.3 數(shù)組元素當任意一個數(shù)組實例被創(chuàng)建時,這個數(shù)組的元素也被同時創(chuàng)建,當不再有任何正對 這個數(shù)組實例的引用時,它的元素也就此失效。數(shù)組中每個元素的初始值為該數(shù)字元素類型的默認值。為了方便

5、明確賦值檢查,所 有的數(shù)字元素都被認為是初始化的。5.1.4 數(shù)值參數(shù)當一個不帶有 ref 或 out 修飾參數(shù)被聲明時,我們稱它為數(shù)值參數(shù)。當被隸屬的函數(shù)子句 function membe(r method, constructor, accessor, operator ) 調用時,數(shù)值參數(shù)自動生成,同時被賦以調用中的參數(shù)值。當函數(shù)成員返回后,數(shù)值參 數(shù)失效。為了方便明確賦值檢查,所有的數(shù)值參數(shù)都被認為是初始化過的。5.1.5 引用參數(shù)當一個帶有 ref 修飾語的參數(shù)被聲明時,我們稱之為引用參數(shù)。引用參數(shù)本身并不創(chuàng)建新的存儲空間。同時,引用參數(shù)指向函數(shù)子句調用中作為參 數(shù)給出的相關變量表征

6、的存儲空間。 這樣,此形式參數(shù)的數(shù)值總是等于它所指向的變量。下面時關于引用參數(shù)的賦值規(guī)則。請注意它們同 在一個變量被傳遞給函數(shù)子句調用中相關引用參數(shù)之前,它自身必須被明確賦值,詳見 5.3 。在函數(shù)子句界定的范圍內(nèi),引用參數(shù)被認為是初始化過的。在結構體類型的方法實例或存取程序實例中,關鍵字 this 就象是此結構體類型的 引用參數(shù),詳見 5.1.6 輸出參數(shù)當一個帶有 out 修飾語的參數(shù)被聲明時,我們稱之為輸出參數(shù)。輸出參數(shù)本身并不創(chuàng)建新的存儲空間。同時,輸出參數(shù)指向函數(shù)子句調用中作為參 數(shù)給出的相關變量表征的存儲空間。 這樣,此輸出參數(shù)的數(shù)值總是等于它所指向的變量。下面時關于輸出參數(shù)的賦值

7、規(guī)則。請注意它們同 在一個變量被傳遞給函數(shù)子句調用中相關輸出參數(shù)之前, 它自身不需要被明確地賦值,詳見 5.3 節(jié)。在函數(shù)子句調用中,每個被傳遞給輸出參數(shù)的變量被認為在該執(zhí)行路徑中已被賦值。在函數(shù)子句界定的范圍內(nèi),輸出參數(shù)被認為是初始化過的。在函數(shù)子句返回之前,每一個輸出參數(shù)必須被明確地賦值,詳見 5.3 節(jié)。在結構體類型的構造函數(shù)中,關鍵字 this 就象是此結構體類型的輸出參數(shù),詳見 5.1.7 局部變量局部變量被局部變量聲明語句創(chuàng)建,該語句可以在 block 塊, for 循環(huán)語句或者 switch 分支語句中出現(xiàn)。當控制權進入 block 塊 , for 循環(huán)語句或者 switch 分

8、支語句 時,其中的相關局部變量被創(chuàng)建。當控制權離開 block 塊, for 循環(huán)語句或者 switch 分支語句時,其中的相關局部變量隨即失效。局部變量不會被自動初始化,也就是說它不會有缺省值。為了方便明確賦值檢查, 局部變量被認為是初始化過的。 局部變量聲明語句可以包括一個變量初始化器,此時該 變量在除它的變量初始化器表達式內(nèi)的完全的有效范圍中被認為是明確賦值的。在一個局部變量的有效范圍中, 在它被聲明之前的所有關于它的引用都被是錯誤的。5.2 默認值下面幾種類型的變量在初始化時被自動賦予相應的默認值:靜態(tài)變量類實例中的實例變量數(shù)組元素變量的默認值直接取決于它自身的類型和下面幾種因素:對于

9、數(shù)值型的變量, 默認值就是被此數(shù)值類型構造函數(shù)計算時使用的數(shù)值,詳見 對于形式型變量,默認值為 null 。5.3 明確賦值在一個特定的函數(shù)子句可執(zhí)行代碼位置, 如果通過靜態(tài)流分析某一個變量被編譯器 證明為被自動初始化或者為至少一條賦值語句的執(zhí)行對象, 那么該變量將被認為是明確 賦值的。關于明確賦值的相關規(guī)則如下所示:一個初始化過的變量(詳見 對于一個在特定位置的未初始化的變量 (詳見 ,如果所有可能的指向該位置的執(zhí)行 路徑滿足以下若干條件中的任何一個,那么它也被認為是明確賦值的:a 在某一個賦值語句中該變量作為左操作數(shù)出現(xiàn),詳見b 任何一個調用表達式(詳見 c 作為局部變量,該變量的局部變量

10、聲明語句包含變量初始化器。一個結構體類型的實例變量的明確賦值狀態(tài)將同時被單獨和共同跟蹤。 另外,除了聲明 的各項規(guī)則之外,下面的各項規(guī)則適用于結構體類型變量和它們的實例變量:如果一個實例變量中包含被明確賦值的結構體類型變量,則該變量被認為是明確賦 值。如果一個結構體類型的變量中的所有實例變量都被認為是明確賦值的,那么這個結 構體變量也是明確賦值的。明確賦值是下列各項的前提:任何時刻,當一個變量 獲得自身的值時,它就是明確賦值的。這樣就可以杜絕不確 定的數(shù)值出現(xiàn)。除去下列情況,表達式中的變量都會獲得相關變量數(shù)值: a 變量作為簡單賦值語句的左操作數(shù)。b 變量作為一個輸出參數(shù)被傳遞c 變量作為結構

11、體類型的變量并在成員訪問中作為左操作數(shù)出現(xiàn)。當變量被作為形式參數(shù)被傳遞時,它本身必須是被明確賦值的。這樣才能確保被調 用的函數(shù)子句認為該形式參數(shù)是被明確賦值的。無論函數(shù)子句在何處返回(通過返回語句 return 和程序執(zhí)行到函數(shù)子句的末尾), 所有函數(shù)子句中的輸出參數(shù)都必須是被明確賦值的。 這樣就確保函數(shù)子句不會返回 不具備明確數(shù)值的輸出參數(shù), 也就使編譯器認為函數(shù)子句把某一變量當作輸出參數(shù) 等同于都給變量賦值。結構體類型的構造函數(shù)自何處返回,其中的 this 變量都必須使被明確賦值的。 下面的例程告訴我們 try 語句的不同 block 會使如何影響明確賦值的。class Astatic v

12、oid F()int i, j; try / neither i nor j definitely assignedi = 1;/ i definitely assignedj = 2;/ i and j definitely assignedcatch / neither i nor j definitely assignedi = 3;/ i definitely assignedfinally / neither i nor j definitely assignedi = 4;/ i definitely assignedj = 5;/ i and j definitely assig

13、ned / i and j definitely assigned靜態(tài)流分析在檢測明確賦值狀態(tài)使將考慮&,| ,?:這些運算符的特殊運算。在下面例程中的每一個 method 我們將會看到class Astatic void F(int x, int y)int i; if (x = 0 & (i = y) = 0) / i definitely assignedelse / i not definitely assigned / i not definitely assignedstatic void G(int x, int y)int i; if (x = 0 | (i = y) = 0)

14、 / i not definitely assignedelse / i definitely assigned / i not definitely assigned變量 i 在 if 語句中的一個嵌套語句中是被明確賦值的,而在其余位置并不如此。在 F method中的if語句的第一個嵌套語句中,因為表達式i = y被事先執(zhí)行,所以變量i在是被明確賦值的。而在這個 if 語句的第二個嵌套語句中,由于變量 i 未被賦值,所 以它被認為是未被明確賦值的。請注意,如果變量 x 的數(shù)值是負的,那么變量 i 是不會 被賦值的。同樣,在 G方法中,變量i在第二個嵌套語句中是被明確賦值的而在第一個 嵌套語句中并不是這樣。5.3.1 初始賦值變量下面所列各種類型的變量屬于初始賦值變量:靜態(tài)變量類實例中的實例變量被初始賦值的結構體類型變量中的實例變量數(shù)組元素數(shù)值參數(shù)形式參數(shù)5.3.2 非初始賦值變量下面類型的變量屬于非初始賦值變量:未被初始賦值的結構體變量中的實例變量輸出參數(shù),包括結構體 c

溫馨提示

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

評論

0/150

提交評論