作用域規則告訴我們乙個變數的有效範圍,它在哪兒建立,在哪兒銷毀(也就是說超出了作用域)。變數的有效作用域從它的定義點開始,到和定義變數之前最鄰近的開括號配對的第乙個閉括號。也就是說,作用域由變數所在的最近一對括號確定。
(1) 全域性變數:
全域性變數是在所有函式體的外部定義的,程式的所在部分(甚至其它檔案中的**)都可以使用。全域性變數不受作用域的影響(也就是說,全域性變數的生命期一直到程式的結束)。如果在乙個檔案中使用extern關鍵字來宣告另乙個檔案中存在的全域性變數,那麼這個檔案可以使用這個資料。
(2) 區域性變數:
區域性變數出現在乙個作用域內,它們是侷限於乙個函式的。區域性變數經常被稱為自動變數,因為它們在進入作用域時自動生成,離開作用域時自動消失。關鍵字auto可以顯式地說明這個問題,但是區域性變數預設為auto,所以沒有必要宣告為auto。
(3) 暫存器變數
暫存器變數是一種區域性變數。關鍵字register告訴編譯器「盡可能快地訪問這個變數」。加快訪問速度取決於現實,但是,正如名字所暗示的那樣,這經常是通過在暫存器中放置變數來做到的。這並不能保證將變置在暫存器中,甚至也不能保證提高訪問速度。這只是對編譯器的乙個暗示。
使用register變數是有限制的:(1) 不可能得到或計算register 變數的位址; (2) register變數只能在乙個塊中宣告(不可能有全域性的或靜態的register變數)。然而可以在乙個函式中(即在參數列中)使用register變數作為乙個形式引數。
一般地,不應當推測編譯器的優化器,因為它可能比我們做得更好。因此,最好避免使用關鍵字register。
(4) 靜態變數
關鍵字static有一些獨特的意義。通常,函式中定義區域性變數在函式中作用域結束時消失。當再次呼叫這個函式時,會重新建立變數的儲存空間,其值會被重新初始化。如果想使區域性變數的值在程式的整個生命期裡仍然存在,我們可以定義函式的區域性變數為static(靜態的),並給它乙個初始化。初始化只在函式第一次呼叫時執行,函式呼叫之間變數的值保持不變,這種方式,函式可以「記住」函式呼叫之間的一些資訊片斷。這也就是所謂的靜態區域性變數,具有區域性作用域,它只被初始化一次,自從第一次被初始化直到程式執行結束都一直存在,它和全域性變數的區別在於全域性變數對所有的函式都是可見的,而靜態區域性變數只在定義自己的函式體內始終可見。
我們可能奇怪為什麼不使用全域性變數。static區域性變數的優點是在函式範圍之外它是不可用的,所以它不可能被輕易改變。這會使錯誤區域性
化。此外同樣存在靜態全域性變數,具有全域性作用域,它與全域性變數的區別在於如果程式包含多個檔案的話,它作用於定義它的檔案裡,不能作用到其它檔案裡,即被static關鍵字修飾過的變數具有檔案作用域。這樣即使兩個不同的原始檔都定義了相同名字的靜態全域性變數,它們也是不同的變數。
(5) 外部變數
extern告訴編譯器存在著乙個變數和函式,即使編譯器在當前的檔案中沒有看到它。這個變數或函式可能在乙個檔案或者在當前檔案的後面定義。例如extern int i;編譯器會知道i肯定作為全域性變數存在於某處。當編譯器看到變數i的定義時,並沒有看到別的宣告,所以知道它在檔案的前面已經找到了同樣宣告的i。
(6) const常量
const告訴編譯器這個名字表示常量,不管是內部的還是使用者定義的資料型別都可以定義為const。如果定義了某物件為常量,然後試圖改變它,編譯器將會產生錯誤。在c++中乙個const必須有初始值。
(7) volatile變數
限定詞const告訴編譯器「這是不會改變的」(這就是允許編譯器執行額外的優化);而限定詞volatile則告訴編譯器「不知道何時變化」,防止編譯器依據變數的穩定性作任何優化。
從分配記憶體空間看:全域性變數,靜態區域性變數,靜態全域性變數都在靜態儲存區分配空間,而區域性變數在棧裡分配空間
C C 中作用域詳解
c c 中作用域詳解 作用域規則告訴我們乙個變數的有效範圍,它在哪兒建立,在哪兒銷毀 也就是說超出了作用域 變數的有效作用域從它的定義點開始,到和定義變數之前最鄰近的開括號配對的第乙個閉括號。也就是說,作用域由變數所在的最近一對括號確定。1 全域性變數 全域性變數是在所有函式體的外部定義的,程式的所...
C C 中作用域詳解
作用域規則告訴我們乙個變數的有效範圍,它在哪兒建立,在哪兒銷毀 也就是說超出了作用域 變數的有效作用域從它的定義點開始,到和定義變數之前最鄰近的開括號配對的第乙個閉括號。也就是說,作用域由變數所在的最近一對括號確定。1 全域性變數 全域性變數是在所有函式體的外部定義的,程式的所在部分 甚至其它檔案中...
C C 中作用域詳解
c c 中作用域詳解 作用域規則告訴我們乙個變數的有效範圍,它在哪兒建立,在哪兒銷毀 也就是說超出了作用域 變數的有效作用域從它的定義點開始,到和定義變數之前最鄰近的開括號配對的第乙個閉括號。也就是說,作用域由變數所在的最近一對括號確定。1 全域性變數 全域性變數是在所有函式體的外部定義的,程式的所...