经常看到有这么一段代码,说一个诡异的现象。
举个例子像这篇博文中的最后一段:
http://blog.csdn.net/mougaidong/article/details/6372765
当然和博文的其他内容无关,只是针对这样一个现象
如下代码:
const int a = 1;
int *p = const_cast<int*>(&a);
*p = 2;
cout << “value a=”<< a << endl;
cout << “value *p=” <<*p << endl;
cout << “address a=” <<&a << endl;
cout << “address p=” <<p << endl;
引用该博文的内容:
"这段代码输出的结果如下:
value a=1
value *p=2
address a=0xbff1d48c
address p=0xbff1d48c"
往往人们用这一现象来解释在C++中不能随意使用const_cast转换。但想想虽然理是在,虽然我们不应该乱用const_cast,但这个现象到底该怎样解释?
我猜大概是因为a在定义的时候被定义为const常量类型,所以程序可能在a初始化时就已经将a的值放在寄存器中,输出时便直接输出1了。于是想到一个方法,在a的定义前面加一个关键字:volatile。这样程序在每次取a的值时都要从内存中取。于是代码变成如下:
volatile const int a = 1;
int *p = const_cast<int*>(&a);
*p = 2;
cout << "value a="<< a << endl;
cout << "value *p=" <<*p << endl;
cout << "address a=" << (int*)&a << endl;
cout << "address p=" <<p << endl;
至于为什么&a需要强制转换,否则会变成bool变量输出,我也不清楚为什么,应该和volatile有关吧。
但至少结果对了:
备注:该实验在win7系统VS2010下进行。在VC++6.0中发现第二个版本的输出没有变,a的值与*p的值不统一。不知何解。