C语言——#define与const的区别

C语言——#define与const的区别

define与const都与常量有关。define是宏定义,它可以把一个标识符变成一个常量,而const是一个修饰符,它可以修饰一个变量为常类型,使其不可被修改。

  1. 本质上两者不同,define修饰出来的是常量。并且是真常量。
  2. 而const修饰的是假常量,它本质还是变量,只不过是不能修改值。
  • 为什么说define修饰出来的是真常量呢?因为,define是宏定义,是宏替换!意味着程序在编译前期会进行文本替换,例如代码define PI 3.14,编译器会将代码中所有出现PI的地方全部用3.14替换,然后在进行编译,所以本质它就是一个常量!
  • 至于const,const一般修饰于定义变量的前面,比如const int a=10,意味着a就一直是10,是一个不可修改的变量。
  • 往后视图给a重新赋值都会引发错误。这就是const修饰之后的结果,但请注意这里不可修改的原因其实是编译器在做检查,检查是否有修改这块内存上的值,一旦有就会报错!所以从根本上说,const修饰的变量依然是一个变量!只不过编译器不让修改而已!

两者的区别

  1. 编译器处理方式不同
  • define 宏是在预处理阶段展开。
  • const 是编译运行阶段使用。
  1. 类型和安全检查不同
  • define 宏没有类型,不做任何类型检查,仅仅是展开。
  • const 有具体的类型,在编译阶段会执行类型检查。
  1. 存储方式不同
  • define 宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存(宏定义不分配内存,变量定义分配内存)。
  • const 会在内存中分配(可以是堆中也可以是栈中)
  1. const可以节省空间,避免不必要的内存分配。
  • const 定义常变量从汇编的角度来看,只是给出了对应的内存地址,而不是像define一样给出的是立即数,所以,const定义的常变量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态存储区),而define定义的常变量在内存中有若干个拷贝。
  1. 编译器通常不为普通const常变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很好。
  2. 宏替换只做替换,不做计算,不做表达式求解。
  • 宏预编译时就替换了,程序运行时,并不分配内存。

总结

类别defineconst
何时处理编译期间进行宏替换编译期间检查是否有修改
谁来执行由系统判断是否被修改由编译器限制
存储位置数据常量在内存只读区变量在哪里就在哪里
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想敲代码的运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值