C與C++中的const

一樣,有下面一段代碼: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變量的間接改變都能獲得

   反映。

 

若是你有更好的理解歡迎一塊兒討論或者分享。

相關文章
相關標籤/搜索