关于const的奇怪结果

wuyg719 2012-04-06 03:09:46
首先上原代码:

int main(){

const int x=43;
const int *x3 = &x;
int* x4 = (int *)x3;

*x4 = 56; // cast change the original meaning?

const int *x5 = &x;
std::cout<< &x << ": x ="<<x<<std::endl; // output : 43 why??
std::cout<< x5 << ": x5 ="<<*x5<<std::endl; // output : 56
std::cout<< x3 << ": x3="<<*x3<<std::endl; // output : 56
std::cout<< x4 << ": x4="<<*x4<<std::endl; // output : 56

return 0;
}

第一行的输出是43,但地址与x3,x4,x5完全一样, 哪位大侠能解释一下吗?
...全文
290 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyg719 2012-04-09
  • 打赏
  • 举报
回复
to supermegaboy
*x4=56是很常见的用法,我在很多正规的教程里看到过
wuyg719 2012-04-09
  • 打赏
  • 举报
回复
刚好看到这篇: C语言中volatile关键字的作用
http://blog.csdn.net/tigerjb/article/details/7427366
乐天的猪 2012-04-06
  • 打赏
  • 举报
回复
长长见识,学习!
pengzhixi 2012-04-06
  • 打赏
  • 举报
回复
这个是编译器优化的结果,可以google“常量折叠"
int main(){

const volatile int x=43;
const volatile int *x3 = &x;
int* x4 = (int *)x3;

*x4 = 56; // cast change the original meaning?

const volatile int *x5 = &x;
std::cout<< &x << ": x ="<<x<<std::endl; // output : 43 why??
std::cout<< x5 << ": x5 ="<<*x5<<std::endl; // output : 56
std::cout<< x3 << ": x3="<<*x3<<std::endl; // output : 56
std::cout<< x4 << ": x4="<<*x4<<std::endl; // output : 56


system("pause");
return 0;
}
飞天御剑流 2012-04-06
  • 打赏
  • 举报
回复
这个叫常量折叠,虽然通过x4真的修改了x的值,但任何使用x的地方都用x的初值代替,才会出现这种现象。是一种巧妙的折中,但是*x4=56仍然属于未定义行为,不应使用这样的代码。
muyi66 2012-04-06
  • 打赏
  • 举报
回复
为了避免你通过指针修改常量的值,当你将指针指向常量时编译器给另外分配了一个地址,并将常量的值复制进去,然后让你的指针指向了新的地址。
cattycat 2012-04-06
  • 打赏
  • 举报
回复
相当于给你另创建了个变量存放你修改后的值。
深圳大哥 2012-04-06
  • 打赏
  • 举报
回复
http://www.cnblogs.com/chenyuming507950417/

64,636

社区成员

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

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