簡體   English   中英

C++中指針和常量的小問題

[英]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_AGE90另一個名稱,編譯器已優化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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM