範圍 全域變數 局部變數 靜態變數 外部變數 常量 volatile變數

來源:互聯網
上載者:User
範圍 全域變數 局部變數 靜態變數 外部變數 常量 volatile變數

範圍:

範圍規則告訴我們一個變數的有效範圍,它在哪兒建立,在哪兒銷毀(也就是說超出了範圍)。變數的有效範圍從它的定義點開始,到和定義變數之前最鄰近的開括弧配對的第一個閉括弧。也就是說,範圍由變數所在的最近一對括弧確定。

全域變數:

全域變數是在所有函數體的外部定義的,程式的所在部分(甚至其它檔案中的代碼)都可以使用。全域變數不受範圍的影響,問題可以使用的(也就是說,全域變數的生命期一直到程式的結束)。如果在一個檔案中使用extern關鍵字來聲明另一個檔案中存在的全域變數,那麼這個檔案可以使用這個資料。

局部變數:

局部變數出現在一個範圍內,它們是局限於一個函數的。局部變數經常被稱為自動變數,因為它們在進入範圍時自動產生,離開範圍時自動消失。關鍵字auto可以顯式地說明這個問題,但是局部變數預設為

auto,所以沒有必要聲明為auto。

寄存器變數

寄存器變數是一種局部變數。關鍵字register告訴編譯器“儘可能快地訪問這個變數”。加快訪問速度取決於現實,但是,正如名字所暗示的那樣,這經常是通過在寄存器中放置變數來做到的。這並不能保證將變置在寄存器中,甚至也不能保證提高訪問速度。這隻是對編譯器的一個暗示。

使用register變數是有限制的。不可能得到或計算register 變數的地址。register變數只能在一個塊中聲明(不可能有全域的或靜態register變數)。然而可以在一個函數中(即在參數表中)使用register變數作為一個形式參數。

一般地,不應當推測編譯器的最佳化器,因為它可能比我們做得更好。因此,最好避免使用關鍵字register。

靜態變數

關鍵字static有一些獨特的意義。通常,函數中定義局部變數在函數中範圍結束時消失。當再次調用這個函數時,會重新建立變數的儲存空間,其值會被重新初始化。如果想使局部變數的值在程式的整個生命期裡仍然存在,我們可以定義函數的局部變數為static(靜態),並給它一個初始化。初始化只在函數第一次調用時執行,函數調用之間變數的值保持不變,這種方式,函數可以“記住”函數調用之間的一些資訊片斷。

我們可能奇怪為什麼不使用全域變數。static變數的優點是在函數範圍之外它是停用,所以它不可能被輕易改變。這會使錯誤局部化。

外部變數

extern告訴編譯器存在著一個變數和函數,即使編譯器在當前的檔案中沒有看到它。這個變數或函數可能在一個檔案或者在當前檔案的後面定義。例如extern int i;編譯器會知道i肯定作為全域變數存在於某處。當編譯器看到變數i的定義時,並沒有看到別的聲明,所以知道它在檔案的前面已經找到了同樣聲明的i 。

常量

const告訴編譯器這個名字表示常量,不管是內部的還是使用者定義的資料類型都可以定義為const。如果定義了某對象為常量,然後試圖改變它,編譯器將會產生錯誤。在C++中一個const必須有初始值。

volatile變數

限定詞const告訴編譯器“這是不會改變的”(這就是允許編譯器執行額外的最佳化);而限定詞volatile則告訴編譯器“不知道何時變化”,防止編譯器依據變數的穩定性作任何最佳化。

參考《Thinking in C++》第一卷第三章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.