下面使用#define和const定义常量:

 #define n_define 10

 int main(int argc, char* argv[],int _version)
{
const int n_const=;
int *p=(int *)&n_const;
*p=;
printf("%d",*p);
printf("\n%d",n_define); return ;
}

上述代码所对应的汇编代码如下:

 mov     [ebp+var_4], 14h    ;n_const的十六进制
lea eax, [ebp+var_4]
mov [ebp+var_8], eax ;int *p=(int *)&n_const
mov ecx, [ebp+var_8]
mov dword ptr [ecx], 1Eh ;*p=30
mov edx, [ebp+var_8]
mov eax, [edx]
push eax
push offset asc_432020 ; "%"
call printf
add esp,
push 0Ah ;n_define的十六进制
push offset aD ; "\n%d"
call printf
add esp,

  汇编代码1-11行对应C++代码5-8行。从汇编代码可以看得出来,在底层const常量和变量没区别。也就是说const定义的是假常量,本质上还是个变量,只不过编译器限制了我们对const常量的修改。而由#define定义的则不同。汇编代码第12行可以看出,编译器已经偷偷做了“手脚”:编译器将n_define替换成了0Ah,而这一步替换是发生在预处理阶段。n_define所对应的20已经变成了二进制,且在指令里面是属于立即数了。所以如果对n_define进行&n_define将会出错。

  换一种通俗易懂的说法是:const常量是编译器级别的常量,而#define常量则是真常量。

最新文章

  1. 让IE8在win7下面能显示使用window.showmodaldialog弹出窗口的地址状态栏
  2. usb驱动开发18之设备生命线
  3. node基础07:写文件
  4. C语言用面向对象的思想写贪吃蛇
  5. Java——Selector
  6. Install FFMPEG and FFMPEG-PHP in CentOS 6 with Virtualmin
  7. STL源码--iterator和traits编程技法
  8. CRM 2013 系统设置新功能一:界面自动保存 及 SDK 中 Xrm.Page.data.entity.save
  9. Extjs利用vtype验证表单
  10. .net4.0下 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误
  11. 三,对于printf函数和C语言编程的初步拓展
  12. 用Django搭建个人博客—(1)
  13. sf
  14. vs2008编译FileZilla客户端源码
  15. Struts2学习---基本配置,action,动态方法调用,action接收参数
  16. 洛谷P2387 [NOI2014]魔法森林(LCT,Splay)
  17. 为什么python运行的慢
  18. HttpWebRequest: Remote server returns error 503 Server Unavailable
  19. Ubuntu安装NVIDA显卡驱动
  20. JavaSE集合(八)之Map

热门文章

  1. 通过yum安装mysql
  2. django 之补充
  3. php提前输出响应及注意问题
  4. iOS学习笔记之正则表达式
  5. 如何理解python中的if __name__=='main'的作用
  6. Python爬虫之利用BeautifulSoup爬取豆瓣小说(三)——将小说信息写入文件
  7. JS中的“use strict” 严格模式
  8. this license has been cancelled
  9. C#中的索引器的简单理解和用法
  10. java关键字---final和transient