無意間看到一題目 是關於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.理解符號替換,就相當於宏定義