乙個變數除了資料型別以外,還有3種屬性:
儲存類別 c++允許使用auto,static,register和extern 4種儲存類別。
作用域 指程式中可以引用該變數的區域。
儲存期 指變數在記憶體的儲存期限。
以上3種屬性是有聯絡的,程式設計者只能宣告變數的儲存類別,通過儲存類別可以確定變數的作用域和儲存期。
要注意儲存類別的用法。auto, static和register 3種儲存類別只能用於變數的定義語句中,如:
auto char c; //字元型自動變數,在函式內定義
static int a; //靜態區域性整型變數或靜態外部整型變數
register int d; //整型暫存器變數,在函式內定義
extern int b; //宣告乙個已定義的外部整型變數
說明: extern只能用來宣告已定義的外部變數,而不能用於變數的定義。只要看到extern,就可以判定這是變數宣告,而不是定義變數的語句。
下面從不同角度分析它們之間的聯絡。
1) 從作用域角度分,有區域性變數和全域性變數。它們採用的儲存類別如下:
全域性變數
2) 從變數儲存期(存在的時間)來區分,有動態儲存和靜態儲存兩種型別。靜態儲存是程式整個執行時間都存在,而動態儲存則是在呼叫函式時臨時分配單元。
靜態儲存
3) 從變數值存放的位置。可分為:
記憶體中動態儲存區: 自動變數和形式引數
cpu 中的暫存器: 暫存器變數
4) 關於作用域和儲存期的概念。
從前面敘述可以知道,對乙個變數的性質可以從兩個方面分析,一是從變數的作用域,一是從變數值存在時間的長短,即儲存期。前者是從空間的角度,後者是從時間的角度。二者有聯絡但不是同一回事。圖4.16是作用域的示意圖,圖4.17是儲存期的示意圖。
圖 4.16
圖 4.17
如果乙個變數在某個檔案或函式範圍內是有效的,則稱該檔案或函式為該變數的作用域,在此作用域內可以引用該變數,所以又稱變數在此作用域內「可見」,這種性質又稱為變數的可見性,例如圖4.16中變數a、b在函式f1中可見。
如果乙個變數值在某一時刻是存在的,則認為這一時刻屬於該變數的儲存期,或稱該變數在此時刻「存在」。表4.2表示各種型別變數的作用域和存在性的情況。
表4.2 變數的作用域和存在性
變數儲存類別函式內
函式外作用域(可見性〉
存在性作用域(可見性)
存在性自動變童和暫存器變置√√
xx靜態區域性變數√√
x√靜態外部變童√√
√(只限本檔案)
√外部變數√√
√√其中「√」表示是,「x」表示否。可以看到自動變數和暫存器變數在函式內的可見性和存在性是一致的。在函式外的可見性和存在性也是一致的。靜態區域性變數在函式外的可見性和存在性不一致。靜態外部變數和外部變數的可見性和存在性是一致的。
如果乙個變數在某個檔案或函式範圍內是有效的,則稱該檔案或函式為該變數的作用域,在此作用域內可以引用該變數,所以又稱變數在此作用域內「可見」,這種性質又稱為變數的可見性,例如圖4.16中變數a、b在函式f1中可見。
如果乙個變數值在某一時刻是存在的,則認為這一時刻屬於該變數的儲存期,或稱該變數在此時刻「存在」。書中表4.2表示各種型別變數的作用域和存在性的情況。
可以看到自動變數和暫存器變數在函式內的可見性和存在性是一致的。在函式外的可見性和存在性也是一致的。靜態區域性變數在函式外的可見性和存在性不一致。靜態外部變數和外部變數的可見性和存在性是一致的。
5) static宣告使變數採用靜態儲存方式,但它對區域性變數和全域性變數所起的作用不同。
對區域性變數來說,static使變數由動態儲存方式改變為靜態儲存方式。而對全域性變數來說,它使變數區域性化(區域性於本檔案),但仍為靜態儲存方式。從作用域角度看,凡有static宣告的,其作用域都是侷限的,或者侷限於本函式內(靜態區域性變數),或者侷限於本檔案內(靜態外部變數)。
變數屬性總結
乙個變數除了資料型別以外,還有3種屬性 1 儲存類別 c 允許使用auto,static,register,extern4種儲存類別 函式中的區域性變數,如果不加static宣告,預設就是自動變數 靜態區域性變數 靜態外部變數 2 作用域 指在程式中可以引用該變數的區域 3 儲存期 指變數在記憶體中...
變數屬性的總結
變數的屬性有五種 1 名字 必須顯示說明 2 型別 必須顯示說明 3 儲存類別 預設方式或顯示說明 使用 auto register static extren 4 作用域 由儲存類別決定 5 生存期 由儲存類別決定 前兩種不必解釋了,顧名思義。下面詳細區分後三種概念 定義 指系統對變數儲存方式的規...
C語言變數屬性
在c語言中,變數是具有屬性的,主要有auto static register extern auto 區域性變數的自動預設屬性,不需要顯示宣告,且儲存在棧上 register 暫存器變數,請求編譯器將區域性變數儲存在暫存器中,由於是請求,編譯器有可能拒絕,所以儘管利用register對變數進行了修飾...