关于const的一个小问题

FlyingFox007 2003-10-21 10:35:35
看看下面的程序:
#include "stdafx.h"
#include "iostream.h"
int main(int argc, char* argv[])
{
const int num=10;
int* t;
t=(int*)#
*t=100;
cout<<*t<<endl;
cout<<num<<endl;
return 0;
}
输出结果为:
100
10

调试一下,设置一个断点,就可以清晰地看到,num的值改变了,为什么输出会不变呢。
...全文
35 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
北极猩猩 2003-10-21
  • 打赏
  • 举报
回复
完了,白写了:(
hawkxjy 2003-10-21
  • 打赏
  • 举报
回复
不明白了,既然num是常量,为何还能够改变它的数值?
北极猩猩 2003-10-21
  • 打赏
  • 举报
回复
const int num=10;
0041203E mov dword ptr [num],0Ah
int* t;
t=(int*)#
00412045 lea eax,[num]
00412048 mov dword ptr [t],eax
*t=100;
0041204B mov eax,dword ptr [t]
0041204E mov dword ptr [eax],64h
cout<<num;
00412054 push 0Ah
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
00412056 mov ecx,offset cout (4318E4h)
0041205B call ostream::operator<< (41104Bh)
cout<<*t;
00412060 mov eax,dword ptr [t]
00412063 mov ecx,dword ptr [eax]
00412065 push ecx
00412066 mov ecx,offset cout (4318E4h)
0041206B call ostream::operator<< (41104Bh)



看到标注的那一条指令了吗?
在输出const int num时,它的值是在编译时已经被替换过了的。如果你不取num的地址改变量在运行时根本没有在内存中占据位置,所有对num的访问都被直接替换为常量的值10
daizh 2003-10-21
  • 打赏
  • 举报
回复
C++的编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。这样在出现num的地方它都会用10替代。
FlyingFox007 2003-10-21
  • 打赏
  • 举报
回复
原来和宏是一样的呀,收到。
rocllllll 2003-10-21
  • 打赏
  • 举报
回复
有道理,建议看一下:
林锐的一本书
  • 打赏
  • 举报
回复
前面已经有人答过了,这是编译器的”功劳“:),它看到num被定义为常量后,就将程序中的num替换为10,也就是说cout<<num;变成了cout<<10,所以会出现上面的结果
FlyingFox007 2003-10-21
  • 打赏
  • 举报
回复
VC6。0 Enterprise Edition
tibetan 2003-10-21
  • 打赏
  • 举报
回复
我学习,有高手解释一下。我也觉得应该改变才对呀。你用的是什么编译器?

64,439

社区成员

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

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