之前有同学题过这个问题,我就想为何要会提这个问题?大概因为他们都与常量有关吧!define是宏定义,它可以把一个标识符变成一个常量,而const是一个修饰符,它可以修饰一个变量为常类型,使其不可被修改!今天我们就把这两个类型做一个区别。
首先,本质上两者不同,define修饰出来的是常量!并且是真常量!
而const修饰的是假常量,它本质还是变量!只不过编译器不让你修改!
下面仔细讲解,为什么说define修饰出来的是真常量呢?因为,define是宏定义,是宏替换!意味着程序在编译前期会进行文本替换,例如代码define PI 3.1415926 这句话,编译器会将代码中所有出现PI的地方全部用3.1415926替换,然后在进行编译,所以本质它就是一个常量嘛!
至于const呢,我们知道const一般修饰于定义变量的前面,比如cosnt int a = 10,意味着a就一直是19,是是一个不可修改的变量了。
往后试图给a重新赋值都会引发错误。这就是const修饰之后的结果,但请注意,这里不可修改的原因其实是编译器在做检查,检查是否有修改这块内存上的值,一旦有就会报错,所以从根本上说,cosnt修饰的变量依然是一个变量!只不过编译器不让你修改而已!
整体总结如下:
类别 | define | cosnt |
何时处理 | 编译期间进行宏替换 | 编译期间检查是否有修改 |
谁来执行 | 由系统判断是否被修改 | 由编译器限制 |
存储位置 | 数据常量在内存只读区 | 变量在哪就在哪里 |
怎么样,这下大家顿悟了吗?
大家有任何问题欢迎联系我们,一起探讨研究!