有关一条常见的const_cast转换的“BUG”解释

经常看到有这么一段代码,说一个诡异的现象。

举个例子像这篇博文中的最后一段:

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的值不统一。不知何解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值