#include <iostream>
using namespace std ;
int main()
{
const int i = 11 ;
const int *pi = &i ;
int *pi2 = const_cast<int *>(pi) ;
*pi2 = 90 ;
cout << &i << \t << i << endl ;
cout << pi << \t << *pi << endl ;
cout << pi2 <<\t<< *pi2 << endl ;
return 0 ;
}
vc6.0下的结果:
0012FF7C 11
0012FF7C 90
0012FF7C 90
Press any key to continue
很不解?
是不是打开了编译优化了?
在优化时编译器有可能不知道*pi2 = 90 ;这句话改变了i的值,结果没有去重新从存储器中去取i的值,导致错误的结果。这是在VC里经常出现的一个编译优化Bug。
编译器优化时,
把有些i替换为11。cout<<i -> cout<<11;
你又强行改变i, 所以其他是90
这个与常量的特性有关。
C++中,凡是使用直接常量的地方,编译的时候会用常量的值直接代换,所以
cout << &i << \t << i << endl ;
相当于
cout << &i << \t << 11 << endl ;
而常量却又真实的存储在内存中,所以可使用它的地址,在执行过程中可改变该地址中的内容而不会改变常量的值。