VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 916|回复: 5

[求助] 为什么等于8?

[复制链接]
55_avatar_middle
在线会员 发表于 2015-10-11 01:14:36 | 显示全部楼层 |阅读模式
程序是这样的

#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
        const int data=8;
        int &d=const_cast<int&>(data);
       
        cout<<&data<<":"<<data<<endl;
            d+=2;
        cout<<&d<<":"<<d<<endl;
        cout<<&data<<":"<<data<<endl;
        system("pause");
        return 0;
}
输出结果
为什么等于8?

看运行过程
当运行过 int &d=const_cast<int&>(data);
&d 的里存的就是data的地址,如下图
为什么等于8?
运行d+=2;后
明显发下在内存中data地址中的值改变了改成了0A如图
为什么等于8?
为什么运行cout<<&data<<":"<<data<<endl;后
data的值还是8呢?




上一篇:用winpcap做了简陋的抓包程序,为什么会抓不完整?
下一篇:vs2010 vs2013使用静态mfc类编译,生成的exe都是几M 有什么好的解决、较小体积办法?
78_avatar_middle
online_supermod 发表于 2015-10-11 08:34:08 | 显示全部楼层
本帖最后由 jpacg 于 2015-10-12 09:17 编辑

因为是const变量,编译器在编译的时候直接把输出data替换成8了。
为什么等于8?

评分

参与人数 1威望 +2 驿站币 +3 热心值 +3 收起 理由
51_avatar_small Syc + 2 + 3 + 3 赞一个!

查看全部评分

78_avatar_middle
online_supermod 发表于 2015-10-11 08:34:54 | 显示全部楼层
你如果直接看反汇编代码,就可以知道为什么了。
55_avatar_middle
ico_lz  楼主| 发表于 2015-10-12 20:33:12 | 显示全部楼层
jpacg 发表于 2015-10-11 08:34
你如果直接看反汇编代码,就可以知道为什么了。

我试下反汇编,我用调试看到值是变了。。
08_avatar_middle
在线会员 发表于 2015-10-12 20:44:02 | 显示全部楼层
编译器优化了。。。。
94_avatar_middle
online_vip 发表于 2015-10-12 23:42:16 | 显示全部楼层
主要是对const关键字的不理解 const 修饰指向int data  的内容是不能修改的,还要很多情况 const int ,int const ,int* const ,const  int*
楼主的情况是const 修饰的 int data = 8;是data作为常量
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-27 22:21

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表