define,const和enmu的区别
来源:互联网 发布:spss剔除异常数据 编辑:程序博客网 时间:2024/06/05 18:34
1.const:修饰的数据类型是指常类型,常类型的变量或对象的值是不能被修改的,类似于只读属性;
关于const的一些常用的使用情况,如下所示:
常变量:
const 数据类型 符号常变量 = 数值 ,如:const float a=2.18;
指针常量:
数据类型 *const 指针变量=变量名,如:NSString* const p="abc"; const修饰的是指针变量,而不是指针的值,所以指针指向的值是可以修改的。
常指针:
const 数据类型 *指针变量=变量名,如 const char* a = @"jack"; 或者是,数据类型 const *指针变量=变量名,如 char* b = @"rose". 这是指针指向的值就是不可以改变的。
还有一种情况就是指针变量本身不可以修改,指针指向的值也是不允许修改的,就是指针常量和常指针组合,这种称为
常指针常量:
const 数据类型 *const 指针变量=变量名, 如const NSString* const c = @"jane"; 或数据类型 const *const 指针变量=变量名, 如NSString* const * const d = @"kangkang"
2. enmu (宏定义枚举)
enum是计算机编程语言中的一种数据类型。枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型:整形常量或单个字符的值。
3)#define
宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现
差异:
1)关于const和#define
第一:#define定义了一个宏,在编译之前(预编译)就会被替换掉,宏不做检查,只是替换,并且在字符替换可能会产生意料不到的错误(边际效应); 而const常量有具体的类型,在编译阶段会执行类型检查,当试图去修改该变量的时候,编译器会报错。
第二:#define可以定义函数,如:#define redcolor [UIColor redColor] , 而const不能。
第三: #define定义的缺点是:如果大量使用,容易造成编译时间久,每次预编译的时候,都会进行替换操作
第四:#define在预编译阶段不会分配内存,在预编译之后,当有变量调用这个宏的时候,会分配一份内存,而const常量会在内存中分配(可以是堆中也可以是栈中)。具体可以参考第五条的解释
第五:const 可以节省空间,避免不必要的内存分配。
例如:#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。
简单的说就是:const只会在被调用的时候分配一次内存,二#define则是在宏替换的时候,每次都会被分配一次内存,比较费内存。
(2)const修饰和enum类型有什么区别
const是修饰,enum是类型定义,这个理解是对的。enum是定义一个新的类型,可以用这个新的类型来定义变量,而且变量的取值范围理论上应该只在enum指定的常量值中去取。
就两都都可以定义常量这一点来看,区别是很明显的,
enum定义常量,但这些常量本身只能是整型值。
const是可以指定任意类型的数据为常量的,比如 const float PI = 3.1416;
(3)define和enum 区别
#define 是预处理指令,是代码编译之前做的工作,仅仅做字符替换,甚至不算C语法的一部分
enum是枚举类型,可以用来声明一系列整型常量,同时也能声明为枚举类型,用来定义枚举变量。
使用的差别是enum的常量只能是整型常量或者单个字符值,
#define却可以 #define NAME "Amy"
后者仅仅是字符替换,如果需要定义一系列的常量,用enum可以省去很多输入
本质上是有很大差别的,对于整型常量,两者也是可以替换着使用的
- define,const和enmu的区别
- const和define的区别
- #define和const的区别
- #define和const的区别
- const和define的区别
- const 和define的区别
- const 和define的区别
- const 和 define 的区别
- const和#define的区别
- const和#define的区别
- const和define的区别
- const和#define的区别
- #define和const的区别
- CONST 和#define的区别
- const和#define的区别
- const和#define的区别
- const和define的区别!
- const和#define的区别
- postgresql基于docker主从复制搭建
- 9.27
- 在外置移动硬盘中安装Win10
- 【IOS学习之常见问题】UIScrollView 不能滑动(ScrollView has ambiguous scrollable content height)
- 内网穿透技术详解 --- Java本地项目,可以让别人通过外网访问 (natapp、ngrok、nat123、花生壳等)
- define,const和enmu的区别
- ios-动态改变高度的注意点
- @RequestMapping注解的使用
- paxos工程中的运用-multi-paxos
- cocos2dx之 android/ios语音交互(二)
- java扫描器
- Java内存溢出和内存泄露
- 逻辑回归知识点
- 通过反射得到model的真实类型