C++中指针和常量的小问题

0 c++ pointers constants

你能向我解释一下这种行为吗?这里的代码:

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; 
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

问题是你对编译器撒了谎,而编译器非常擅长报复那些对他们撒谎的人。

具体来说,在这一行中,您告诉编译器MAX_AGE是可变的:

b = (int*)&MAX_AGE;
Run Code Online (Sandbox Code Playgroud)

这是一个谎言,因为你宣称MAX_AGE自己是一个const. 接下来发生的事情称为未定义行为 (UB):在您的代码触发 UB 之后,编译器可以自由地产生任何结果,包括完全无意义的结果。

但是,在您的情况下,对打印的内容有一个很好的解释:知道这MAX_AGE是 的另一个名称90,编译器已优化std::cout << MAX_AGE << std::endl;为 print 90,而无需从内存中查找其值。