奇怪的CONST,请大家试试下面的代码,给我个答案

俞庆平 2010-04-23 03:05:18
int _tmain(int argc, _TCHAR* argv[])
{
const int a = 5;
int * p;
p = (int *)&a;
cout << p << " " << &a << endl;
int b = *(&a);

*p = 4;

int c = *p;

int d = *(&a);

cout << p << " " << &a << endl;

cout << "b " << b << " c " << c << " d " << d << endl;

system ("pause");
return 0;
}
输出结果为:
0012FF60 0012FF60
0012FF60 0012FF60
b 5 c 4 d 5
...全文
101 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhd3767 2010-04-23
  • 打赏
  • 举报
回复
mark
space_time 2010-04-23
  • 打赏
  • 举报
回复
跟了下代码
vc6
发现
a所在的地址的值确实被改成了4
但是编译器把所有对a的引用都换成了5,类似宏,所以d=5
俞庆平 2010-04-23
  • 打赏
  • 举报
回复
通过对比汇编,常量*(&a)会被直接用5代替,所以结果与代码看似矛盾,事实已经被编译器在编译时处理过了。
但对于
另外一句*(&a+1-1),计算结果将不再是5,而是4。有兴趣可以试试。
俞庆平 2010-04-23
  • 打赏
  • 举报
回复
虽然某种意义上,常量折叠是正确的,但不完全对。
1、上述p获得的地址无法解释
2、下面的代码无法解释:

const char * a = "abcdefg";
char * p = (char *)a;

cout << p << " " << a << endl;

p[3]='m';

cout << p << " " << a << endl;

system ("pause");

这里在p[3]='m'时直接提示访问内存错误。p仍然有a的地址。
jiuchang 2010-04-23
  • 打赏
  • 举报
回复
*p 和 *(&a)的结果为什么不一样呢
p不是指向a的么, p=&a
pengzhixi 2010-04-23
  • 打赏
  • 举报
回复
常量折叠。
jackyjkchen 2010-04-23
  • 打赏
  • 举报
回复
你是说内存地址一样但值不一样?

没问题,对于const,C++保证其值不变,哪怕你用某些非正常手段去改他的值
chainyu 2010-04-23
  • 打赏
  • 举报
回复

0012FF60 0012FF60
0012FF60 0012FF60
b 5 c 4 d 5
请按任意键继续. . .
taodm 2010-04-23
  • 打赏
  • 举报
回复
呃,google“常量折叠”

64,683

社区成员

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

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