const 常量与 #define宏定义的区别

const 常量与 #define宏定义的区别

参考博客:
[https://www.cnblogs.com/xumaomao/articles/11049541.html](%5Bhttps://www.cnblogs.com/xumaomao/articles/11049541.html%5D%28https://www.cnblogs.com/xumaomao/articles/11049541.html%29)

https://blog.csdn.net/weibo1230123/article/details/81981384

const 常量与 #define宏定义的用法

define 用法

#define 标识符 常量

#define pi 3.14

const 用法

const 数据类型 变量名 = 常量

const double pi = 3.14;

一:区别

(1)就起作用的阶段而言: #define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。

编译器处理不同

宏定义是一个“编译时”概念,在预处理阶段展开(在编译时把所有用到宏定义值的地方用宏定义常量替换),不能对宏定义进行调试,生命周期结束于编译时期;
const常量是一个“运行时”概念,在程序运行使用,类似于一个只读行数据

(2)就起作用的方式而言: #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。

类型和安全检查不同

宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;
const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查

(3)就存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;const定义的只读变量在程序运行过程中只有一份备份。

宏定义是直接替换,不会分配内存,存储与程序的代码段中;const常量需要进行内存分配

(4)从代码调试的方便程度而言: const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了。

二:const优点

(1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对 define 只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
(2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
(3)const可节省空间,避免不必要的内存分配,提高效率

三、理解

void f1 ()
{

    #define N 12
    const int n 12;
    
}

    void f2 ()
{
    cout<<N <<endl; //正确,N已经定义过,不受定义域限制
    cout<<n <<endl; //错误,n定义域只在f1函数中
}

定义后能否取消

宏定义可以通过 #undef 来使之前的宏定义失效
const 常量定义后将在定义域内永久有效

void f1()
{
  #define N 12
  const int n = 12;
  
  #undef N //取消宏定义后,即使在f1函数中,N也无效了
  #define N 21//取消后可以重新定义
}

总结

宏定义在编译时把所有用到宏定义值的地方用宏定义常量替换。const常量可以看作是一个只读变量,需要指定类型,需要分配内存,有自己的作用域。

define修饰出来的是真常量。因为,define是宏定义,是宏替换!意味着程序在编译前期会进行文本替换,例如代码define PI 3.1415926 这句话,编译器会将代码中所有出现PI的地方全部用3.1415926替换,然后在进行编译,所以本质它就是一个常量嘛!

至于const呢,我们知道const一般修饰于定义变量的前面,比如cosnt int a = 10,意味着a就一直是19,是是一个不可修改的变量了。

往后试图给a重新赋值都会引发错误。这就是const修饰之后的结果,但请注意,这里不可修改的原因其实是编译器在做检查,检查是否有修改这块内存上的值,一旦有就会报错,所以从根本上说,cosnt修饰的变量依然是一个变量!只不过编译器不让你修改而已!

推荐日常使用中 用 const 变量

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页
评论

打赏作者

何为xl

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值