大家探讨下这几行代码!

lhz62004753 2008-10-31 04:44:08
const int i=40;//常量 i
int *p = (int *)&i;//强制转换
*p = 80;
cout<<*p<<endl;
cout<<i<<endl;
cout<<p<<" "<<&i<<endl;
运行结果是*p的值为80,而i的值还是40,不知道是为什么,有哪位高手解答下,谢谢
...全文
133 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhz62004753 2008-10-31
  • 打赏
  • 举报
回复
谢谢各位了,就是说编译器在后头搞的鬼,其实i的值是改变了的。。。。
机智的呆呆 2008-10-31
  • 打赏
  • 举报
回复

volatile const int i=40;//取消编译器优化
redleaves 2008-10-31
  • 打赏
  • 举报
回复
const会编译时展开,直接用值替换对象本身...
lq651659889 2008-10-31
  • 打赏
  • 举报
回复
up
yuegui2 2008-10-31
  • 打赏
  • 举报
回复
*p = 80;
很明显的赋值语句嘛
太乙 2008-10-31
  • 打赏
  • 举报
回复
编译器在编译期间就做了手脚!

将所有的i替换成了40!!
hhyttppd 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luansxx 的回复:]
cout < <i < <endl;
在编译这个的时候,编译器认为i是常量,直接用40替换了,并没有去关心i是不是已经变了。另外i肯定是有地址的,而且实实在在存在,并不是编译器临时变量。
[/Quote]

我观察了一个VS2005的汇编输出,果然如你所言。
Fighting Horse 2008-10-31
  • 打赏
  • 举报
回复
cout < <i < <endl;
在编译这个的时候,编译器认为i是常量,直接用40替换了,并没有去关心i是不是已经变了。另外i肯定是有地址的,而且实实在在存在,并不是编译器临时变量。
VsirSoft 2008-10-31
  • 打赏
  • 举报
回复
int *p = (int *)&i;这句话只是将i的地址赋值给了*p而已,而p并没有指向i的地址。

哦 另外2楼所说的有点错误 p是指向i的地址的 只不过地址的内容无法更改
VsirSoft 2008-10-31
  • 打赏
  • 举报
回复
关键就在于 const 楼主应该去搜索一篇关于const的文章学习一下 把const去掉你会看到效果
hhyttppd 2008-10-31
  • 打赏
  • 举报
回复
可能是生成了临时变量,这种行习标准上说是未定义的(undefined)
相当于
const int i=40;//常量 i
//int *p = (int *)&i;//强制转换
int temp = 40;
int * p = &temp;
*p = 80;
cout < <*p < <endl;
cout < <i < <endl;
cout < <p < <" " < <&i < <endl;
coverallwangp 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 lhz62004753 的帖子:]
const int i=40;//常量 i
int *p = (int *)&i;//强制转换
*p = 80;
cout < <*p < <endl;
cout < <i < <endl;
cout < <p < <" " < <&i < <endl;
运行结果是*p的值为80,而i的值还是40,不知道是为什么,有哪位高手解答下,谢谢
[/Quote]

*p赋值为80,当然*p的值就是80了,i是个const常量没法改变再说你也没有改变,所以还是40

int *p = (int *)&i;这句话只是将i的地址赋值给了*p而已,而p并没有指向i的地址。
Mougou 2008-10-31
  • 打赏
  • 举报
回复
翻翻今天上午的帖子,我刚刚回答过

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧