關於const變量的一點理解

無意間看到一題目 是關於const變量的。代如下

 

 問題是:

pCInt = &LENGTH,

然而後面的輸出是1 2

爲什麼?

 

一步一步分析,const int *pCInt = & LENGTH;

pCInt 爲指向LENGTH地址的值,且爲常量。

(int) *pCInt = 2; 實際上等同 const_cast<int>(*pCInt) = 2;

去掉變量的常量屬性再賦值。也就是改變了 pCInt 指向的地址的值爲2.

即然值爲2,那麼LENGTH中內存的值也爲2,爲什麼會輸出1呢?是不是編譯器做了

什麼處理?(我當時給出的回答就是編譯器做出了處理,具體是什麼不清楚)

後來仔細想了下,可能是符號替換,不知道對不。

 

下面用匯編代碼來驗證我們的想法。

(爲了看得清楚,把cout改成printf了) 

 

從printf("%d/n",LENGTH);

00401056  push        1   

可以看出,編譯器是做的符號替換,就是在編譯的時候遇到LENGHT直接替換爲1

 

printf("%d/n",*pCInt);

00401065  mov         eax,dword ptr [pCInt] 

00401068  mov         ecx,dword ptr [eax] 

 

遇到*pCInt是直接從內存中去取值。

 

 

總結如下:

 1.變量本身的類型最好不要去改變,除非必要。

 2.要明確cosnt的意義,什麼時候該用,什麼時候不該用,這是基本功。

 3.理解符號替換,就相當於宏定義

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章