超奇怪问题

MagicCarmack 2006-04-25 11:00:41
#include<iostream.h>
void main()
{
const int x=100;
cout<< int(&x) <<endl;
int *iptr=(int*)((void*)(&x));
*iptr=200;
cout<<int(iptr)<<' '<<int(&x)<<endl;
cout<<*iptr<<' '<<x<<endl;
}


VC6.0下输出结果为
1245052
1245052 1245052
200 100

老大帮我分析一下程序
...全文
367 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
MagicCarmack 2006-04-27
  • 打赏
  • 举报
回复
结贴算了

大概有个眉目了
jjzhyh586 2006-04-26
  • 打赏
  • 举报
回复
#include<iostream.h>
void main()
{
const int x=100;
const int *p=&x;
cout<< int(&x) <<endl;

/a1/int *iptr=(int*)((void*)(&x));
/a2/*iptr=500;

/b1/int *jptr=(int*)(p);
/b2/*jptr=300;

cout<<int(iptr)<<' '<<int(jptr)<<' '<<int(&x)<<endl;
cout<<*iptr<<' '<<*jptr<<' '<<x<<' '<<*p<<endl;
}

先看调试结果。
1245052
1245052 1245052
300 300 100 300

b1,b2放在ai,a2前面时是
500 500 100 500

用const 声明的*p值变啦?
这个怎么解释...
难道const只是形式上的不可改变的变量?
只是不能用x=200;或*p=200;
这样的语句而已吗?
kundy 2006-04-26
  • 打赏
  • 举报
回复
学习!
jjzhyh586 2006-04-26
  • 打赏
  • 举报
回复
楼上说的对。制定编译器的时候,编译器见到X就打出初始化时候的值.COUT<<X<<ENDL;
等于
COUT<<100<<ENDL;
在看这里的解释
http://dev.csdn.net/develop/article/83/83854.shtm
rexking0 2006-04-26
  • 打赏
  • 举报
回复
直接对地址的操作都是可以改变的。如楼上有说,见x就输出100的可能性很大。
就像c++ 类中的私有成员,用地址的话都是可以直接访问的。
leolovefun 2006-04-26
  • 打赏
  • 举报
回复
先前见到有说是<< 常量折叠 >>,有点不太明白,这里有人知道是什么意思吗?
老道_ 2006-04-26
  • 打赏
  • 举报
回复
就是上面的几位说的,const int x=100;
编译器一看到它就执行cout<<x<<endl;了,
你可以改成int x=100看看,此时cout<<*iptr<<' '<<x<<endl;输出的都是200
wengerbin 2006-04-26
  • 打赏
  • 举报
回复
楼上的"const int *p=&x;" 说的是 P不可改变.而对于其指向地址的内容是可变的.
cdef9108 2006-04-26
  • 打赏
  • 举报
回复
学习中
du51 2006-04-26
  • 打赏
  • 举报
回复
对x取址是那个空间,但是,见到X就进行替换。
du51 2006-04-26
  • 打赏
  • 举报
回复
为什么同一个地址里的内容却不一样呢?


因为对x进行了简单的替换,而不是取出来的。
MagicCarmack 2006-04-26
  • 打赏
  • 举报
回复
include<iostream.h>
void main()
{
const int x=100;
cout<< int(&x) <<endl;
int *iptr=(int*)((void*)(&x));//在这里的时候iptr是指向x的吧,也即地址(1245052)
*iptr=200; //这个200是不是存进地址1245052里呢?
//如果不是,那200存放在何处呢?如果是,那100又在存放在哪里呢?
cout<<int(iptr)<<' '<<int(&x)<<endl; //这里输出是同一个地址1245052
cout<<*iptr<<' '<<x<<endl; //但为什么同一个地址里的内容却不一样呢?
}


VC6.0下输出结果为
1245052
1245052 1245052
200 100
ykzhujiang 2006-04-25
  • 打赏
  • 举报
回复
我看了一下汇编的代码,在cout<<x的时候
直接就是push 64h 传递的值
我觉得对于这种const int可能处理方式就是能编译期确定的仍然编译期进行常量替换,剩下的才进行取址
MagicCarmack 2006-04-25
  • 打赏
  • 举报
回复
我现在最大的疑问就是x和iptr指向同一个地址

但是输出的内容却不一样,那个200是放在什么地方的呢?
ykzhujiang 2006-04-25
  • 打赏
  • 举报
回复
g++下结果类似,对于这种情况下不知道C++标准中是否对于实现方式有规定,关注一下
du51 2006-04-25
  • 打赏
  • 举报
回复
随编译器有所不同.
在有些编译器里const常量是类似于宏那样定义的.

只要见到x就输出100

65,187

社区成员

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

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