const和volatile的區別

2022-08-29 06:30:13 字數 1469 閱讀 6344

一.關鍵字const有什麼含意?

只要一聽到說:「const意味著常數」,就知道我正在和乙個業餘者打交道。去年dan saks已經在他的文章裡完全概括了const的所有用法,因此esp(譯者:embedded systems programming)的每一位讀者應該非常熟悉const能做什麼和不能做什麼.如果你從沒有讀到那篇文章,只要能說出const意味著「唯讀」就可以了。儘管這個答案不是完全的答案,但我接受它作為乙個正確的答案。(如果你想知道更詳細的答案,仔細讀一下saks的文章吧。)

如果應試者能正確回答這個問題,我將問他乙個附加的問題:

下面的宣告都是什麼意思?

const int a;

int const a;

const int *a;

int * const a;

int const * const a ;

前兩個的作用是一樣,a是乙個常整型數。第三個意味著a是乙個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。第四個意思a是乙個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。最後乙個意味著a是乙個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的)。如果應試者能正確回答這些問題,那麼他就給我留下了乙個好印象。順帶提一句,也許你可能會問,即使不用關鍵字 const,也還是能很容易寫出功能正確的程式,那麼我為什麼還要如此看重關鍵字const呢?我也如下的幾下理由:

?; 關鍵字const的作用是為給讀你**的人傳達非常有用的資訊,實際上,宣告乙個引數為常量是為了告訴了使用者這個引數的應用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的資訊。(當然,懂得用const的程式設計師很少會留下的垃圾讓別人來清理的。)

?; 通過給優化器一些附加的資訊,使用關鍵字const也許能產生更緊湊的**。

?; 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的引數,防止其被無意的**修改。簡而言之,這樣可以減少bug的出現。

二,volatile

volatile

影響編譯器編譯的結果,指volatile 變數是隨時可能發生變化的,與volatile變數有關的運算,不要進行編譯優化,以免出錯,(vc++ 在產生release版可執行碼時會進行編譯優化,加volatile關鍵字的變數有關的運算,將不進行編譯優化。)。

例如:volatile int i=10; 

int j = i; 

... 

int k = i; 

volatile 告訴編譯器i是隨時可能發生變化的,每次使用它的時候必須從i的位址中讀取,因而編譯器生成的可執行碼會重新從i的位址讀取資料放在k中。而優化做法是,由於編譯器發現兩次從i讀資料的**之間的**沒有對i進行過操作,它會自動把上次讀的資料放在k中。而不是重新從i裡面讀。這樣一來,如果i是乙個暫存器變數或者表示乙個埠資料就容易出錯,所以說volatile可以保證對特殊位址的穩定訪問,不會出錯。 

九 const 和volatile 分析

const 唯讀變數 const 修飾的變數是唯讀的,本質還是變數 const 修飾的區域性變數在棧上分配空間 const 修飾的全域性變數在全域性資料區分配空間 const 只在編譯期,在執行期無用 const 修飾的變數不是真的常量,它只是告訴編譯器該變數不能出現在賦值符號的左邊 在現代c語言編...

筆記 關於const和volatile

關於這方面的內容,我自己經驗不夠說得不夠清楚。但又想記錄下來,於是上網找了的提問。問題帖子 1.volatile volatile標識乙個變數意味著這個變數可能被非本程式的其他過程改變,例如某個訪問這一變數的某中斷程式。為變數加上這一標識可以禁止編譯器的優化,使程式正確地按設計者的意圖執行。例如下面...

c 中的const和volatile知識自我總結

學習了下c 中的const關鍵字,總結如下。1 const限制乙個變數不能修改其內容,如果強行修改的話,如下面 這樣子,編譯就會報錯,表示式必須是可修改的左值 int main 2 如果通過指標強行修改呢,如下面 這樣子。int main 編譯可以通過,但是輸出來之後可以看到a還是6,但是 p是12...