[英]Little problem with pointers and constants in C++
你能向我解釋一下這種行為嗎? 這里的代碼:
int* b = new int;
const int MAX_AGE = 90;
b = (int*)&MAX_AGE;
std::cout << b << std::endl;
std::cout << &MAX_AGE << std::endl;
std::cout << *b << std::endl;
std::cout << MAX_AGE << std::endl;
std::cout << "........." << std::endl;
*b = 2;
std::cout << *b << std::endl; // HERE I get 2, that's ok
std::cout << MAX_AGE << std::endl; // HERE I still get 90, why?
std::cout << b << std::endl;
std::cout << &MAX_AGE << std::endl;
問題是你對編譯器撒了謊,而編譯器非常擅長報復那些對他們撒謊的人。
具體來說,在這一行中,您告訴編譯器MAX_AGE
是可變的:
b = (int*)&MAX_AGE;
這是謊言,因為您將MAX_AGE
聲明為const
。 接下來發生的事情稱為未定義行為 (UB) :在您的代碼觸發 UB 之后,編譯器可以自由地產生任何結果,包括完全無意義的結果。
但是,在您的情況下,對打印的內容有一個很好的解釋:知道MAX_AGE
是90
另一個名稱,編譯器已優化std::cout << MAX_AGE << std::endl;
打印90
,而無需從內存中查找其值。
MAX_AGE
被聲明為const int
。 使用您的 c 樣式轉換,您可以刪除 constness,然后繼續修改 const 值。 這是 UB。
這是為什么這是 UB 的一個主要示例:由於MAX_AGE
,編譯器知道它不會改變,因此可以用文字90
替換它的所有出現。
const
告訴編譯器變量MAX_AGE
應該存儲在內存中相應段的寫保護區域中。 有了這些知識,編譯器就可以避免重復讀取同一內存位置的需要。 換句話說,編譯器可能會緩存常量值。 這就是為什么您會看到MAX_AGE
顯示為原始值。
無論如何,正如已經提到的,您不應該將編譯器與您的實際意圖混淆。 如果您打算將變量存儲在寫保護區域中,則不應修改它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.