有点搞不懂了!!

earnest810 2003-03-13 11:11:14
#include"iostream.h"
main()
{
const int b=1;
int *a=(int*) &b;
*a=3;
cout<<*a<<b;
}

//输出为 3,1。
//如何解释????
...全文
23 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu_feng_fly 2003-03-13
  • 打赏
  • 举报
回复
to prettynacl(lulu) :
可以看出a与&b是一样的啊,而且,cout<<*a<<*(&b)<<endl;会输出31
而cout<<*a<<*(int*)(&b)<<endl;会输出33为什么呢?
我想可能是这样的&b得到b的地址,是const int* ,这样编译器就还可以进行优化,直接使用1来替代b .(int*)(&b)你强制转换成了int*,不再是const,这样编译器就无法进行优化,不会用1来代替b
ShapeRock 2003-03-13
  • 打赏
  • 举报
回复
我测了一下。是因为const的原故。编译器会为const产生一个临时的副本给*a.原以*a和b已不是指向同一个地址了。打个比方。
void f(int &b)
{
}
float c;
f(c);
由于类型不匹配,所以会产生一个c的副本被函数调用。
eadi 2003-03-13
  • 打赏
  • 举报
回复
实际上是一个二级指针,(int*)b地址(常量地址),&b地址(非常量地址),a指向第二个地址,我的理解&b应不是常量地址。一点看法,还望指教。
prettynacl 2003-03-13
  • 打赏
  • 举报
回复
#include"iostream.h"
main()
{
const int b=1;
int *a=(int*)&b;
*a=3;
cout<<a<<endl;
cout<<&b<<endl;
cout<<*a<<b<<endl;
cout<<*a<<*(&b)<<endl;
cout<<*a<<*(int*)(&b)<<endl;
}
可以看出a与&b是一样的啊,而且,cout<<*a<<*(&b)<<endl;会输出31
而cout<<*a<<*(int*)(&b)<<endl;会输出33为什么呢?
liu_feng_fly 2003-03-13
  • 打赏
  • 举报
回复
b是const int类型,这样写给编译器优化留下空间,表明你不会也不应该通过任何方法去改变b的值,const嘛。所以
cout << *a << b;就会直接使用1来代替b,变成
cout << *a << 1;这样提高了效率,又不影响程序员的本意。所以,在编译的时候,所有的使用变量b的地方都被替换成了1,就有这样的结果了。如果你希望输出是3,3,那么不要使用const int b = 1;写int b = 1;不写const就可以了。或者,写成volatile const int b = 1;试试,volatile 关键字会禁止掉编译器的这种优化
kunp 2003-03-13
  • 打赏
  • 举报
回复
studying
  • 打赏
  • 举报
回复
const int b=1;
int *a=(int*) &b; //你使用了强行转换,因此得到的指针只是b的一个副本,即虽然*a=1,但它的地址和&b已经不同了:)
*a=3;
cout<<*a<<b;

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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