一樣,有下面一段代碼:ios
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 const int i = 0; 7 int *j = (int *) &i; 8 *j = 1; 9 cout<<"i address = 0x"<<hex<<&i<<","<<"j address = 0x"<<hex<<j<<endl; 10 cout<<"i value = "<<i<<","<<"j value = "<<*j<<endl; 11 system("pause"); 12 return 0; 13 }
咱們在C++編譯器中運行以下:c++
咱們發現const關鍵字嚴格遵照了其關於常量的定義。然而疑問出來了測試
爲何相同的地址會輸出不一樣的值。優化
一樣的代碼咱們放入C編譯器中運行會發現輸出結果:spa
i value = 1,j value =1
這是爲何呢?code
如下是我本身的一點理解:blog
1.C語言中const爲不可改變的變量,其實質仍然是變量,仍然會在編譯期間分配內存內存
那麼咱們能夠獲取該內存並修改該內存處的值。這樣雖然不容許直接對const 變量修改編譯器
可是間接修改該內存位置的值達到修改該變量的效果。io
2.C++中const關鍵字定義的是常量類型,在編譯的期間直接肯定了其值,好比咱們
可進行以下操做在C++中 編譯是能夠經過的
1 const int size=5; 2 int array[size];
代表在編譯的時候size是已經肯定了。然而這種狀況在C語言的狀況下是絕對不能夠編譯經過的,
其實我猜,當咱們在c++中定義一個const類型的變量的時候,編譯器也是要爲其分配內存的,
只不過在編譯階段遇到時候直接替換,在運行的時候,該常量的值是直接存在某個寄存器中,這樣
運行代碼中須要用到該值時直接可從寄存器中索取,而非在內存中索取。
那麼,咱們能夠做這樣一種測試,咱們把const前面加上volatile關鍵字防止編譯器直接從寄存器中取
常量值,而是從內存中取,代碼以下:
咱們發現此時,const類型變量i的值是已經被改變了,則證實我猜測的思路也許是對的,又或許編譯器
用了更復雜的方式處理,可是大概思路應該是這樣吧
最後咱們總結下:
前面說了那麼多無非有如下兩點:
1.C C++中的const變量是都要分配內存的。
2.C++只不過在編譯的時候直接進行變量替換,同時在運行過程當中直接在寄存器中取const變量的
值,這是C++編譯器優化的結果。
3.而對於C語言而言每次const使用都是直接從內存中取值,這樣每次const變量的間接改變都能獲得
反映。
若是你有更好的理解歡迎一塊兒討論或者分享。