为什么要有枚举类型?枚举类型和define定义出来的常量有什么区别?

suolaisi 2011-01-30 06:37:45
为什么要有枚举类型?枚举类型和define定义出来的常量有什么区别?
...全文
1129 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyu19910407 2013-07-22
  • 打赏
  • 举报
回复
枚举是个不错的东西,方便开发人员阅读和利用代码
wizard_tiger 2011-01-31
  • 打赏
  • 举报
回复
#define 只是简单的字符替换。
而枚举类型是整型常量。
pang123hui 2011-01-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 supermegaboy 的回复:]
引用楼主 suolaisi 的回复:
为什么要有枚举类型?枚举类型和define定义出来的常量有什么区别?


枚举常量与宏的区别主要有几点:

1。枚举常量是实体中的一种,但宏不是实体;
2。枚举常量属于常量,但宏不是常量(有些书把类对象宏称为预处理常量,这是错误的说法,标准C/C++没有预处理常量这种不知从哪里冒出来的说法);
3。枚举常量具有类型,但宏没有类型,枚举变量具有与……
[/Quote]

一直再向你学习,呵呵
pang123hui 2011-01-31
  • 打赏
  • 举报
回复
经常需要为某些属性定义一组可 选择的值。例如,文件打开的状态可能会有三种:输入、输出和追加。记录这些状态值的一种方法是使每种状态都与一个唯一的常数值相关联。我们可能会这样编写 代码:
const int input = 0;
const int output = 1;
const int append = 2;
虽然这种方法也能奏效,但是它有个明显的缺点:没有指出这些值是相关联的 。 枚举 ( enumeration )提供 了一种替代的方法,不但定义了整数常量集,而且还把它们进行了分组。
1. 定义和初始化枚举
枚举的定义包括关键字 enum ,其后是一个可选的枚举类型名,和一个 用花括号括起来、用逗号分开的 枚举成员 ( enumerators ) 列表。
// input is 0, output is 1, and append is 2
enum open_modes {input, output, append};
默认地,第一个枚举成员赋值为0,后面的每个枚举成员赋的值比前面的大 1 。
2. 枚举成员是常量
可以为一个或多个枚举成员提供初始值,用来初始化 枚举成员的值必须是一个 常量表达式 ( constant expression ) 。常量表达式是编译器在编译时就能够计算出结果的整型表达式。整型字面值常量是常量表达式,正如一个通过常量表达式自我初始化的 const 对象( 2.4 节)也是常量表达式一样。
例如,可以定义下列枚举类型:
// shape is 1,sphereis 2,cylinderis 3,polygonis 4
enum Forms {shape = 1, sphere, cylinder, polygon};
在枚举类型 Forms 中,显式将 shape 赋 值为 1 。 其他枚举成员隐式初始化: sphere 初始化为 2 , cylinder 初始化为 3 , polygon 初始化为 4 。
枚举成员值可以是不唯一的。
// point2d is2, point2w is3, point3d is3, point3w is4
enum Points { point2d = 2, point2w,
point3d = 3, point3w };
本例中,枚举成员 point2d 显式初始化为 2 。下一 个枚举成员 point2w 默认初始化,即它的值比前一枚举成员的值大 1 。因 此 point2w 初始化为 3 。枚举 成员 point3d 显式初始化为 3 。一 样, point3w 默认初始化,结果为 4 。
不能改变枚举成员的值。枚举成员本身就是一个常量 表达式,所以也可用于需要常量表达式的任何地方 。
3. 每个enum 都 定义一种唯一的类型
每个 enum 都定义了一种新的类型。和其他类型一样,可以定义和初始化 Points 类型的对象,也可以以不同的方式使用这些对象。枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚 举类型的其他对象来进行:
Points pt3d = point3d; // ok: point3d is aPoints enumerator
Points pt2w = 3; // error:pt2winitialized withint
pt2w = polygon; // error:polygonis not aPointsenumerator
pt2w = pt3d; // ok: both are objects ofPoints enumtype
注意把 3 赋给 Points 对象是非法的,即使 3 与一个 Points 枚举成员相关联。
宏和枚举的区别(#define VS enum)
宏和枚举之间的差别主要在作用的时期和存储的形式不同,宏是在预处理的阶段进行替换工作的,它替换代码段的文本,程序运行的过程中宏已不 存在了。而枚举是在程序运行之后才起作用的, 枚举常量存储在数据段的静态存储区里 。宏占用代码段的空间,而 枚举除了占用空间,还消耗CPU资源。

但也不能就此说宏比枚举好,如果需要定义非常多的常量,用一条enum {.....}明显比一大堆define更清晰,枚举也可以用来定义一些特殊类型,比如Bool,如:

type enum {FALSE,TRUE} Bool;
qpx1125 2011-01-31
  • 打赏
  • 举报
回复
枚举是一种类型,可以定义该类型的一个变量,define则不行
typedef enum {
NORTH, SOUTH, WEST, EAST
} Direction;

typedef enum {
BIG, MIDDLE, SMALL
} Size;

void f(Direction d, Size s)
{}

把同属一类的放在一起,具有类型检查,看起来更舒服,不必关心 NORTH 具体被定义成哪个数字
AnYidan 2011-01-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 supermegaboy 的回复:]
引用楼主 suolaisi 的回复:
为什么要有枚举类型?枚举类型和define定义出来的常量有什么区别?


枚举常量与宏的区别主要有几点:

1。枚举常量是实体中的一种,但宏不是实体;
2。枚举常量属于常量,但宏不是常量(有些书把类对象宏称为预处理常量,这是错误的说法,标准C/C++没有预处理常量这种不知从哪里冒出来的说法);
3。枚举常量具有类型,但宏没有类型,枚举变量具有与……
[/Quote]

引用一下,惭愧从未用过枚举
pengzhixi 2011-01-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 supermegaboy 的回复:]
引用楼主 suolaisi 的回复:
为什么要有枚举类型?枚举类型和define定义出来的常量有什么区别?


枚举常量与宏的区别主要有几点:

1。枚举常量是实体中的一种,但宏不是实体;
2。枚举常量属于常量,但宏不是常量(有些书把类对象宏称为预处理常量,这是错误的说法,标准C/C++没有预处理常量这种不知从哪里冒出来的说法);
3。枚举常量具有类型,但宏没有类型,枚举变量具有与……
[/Quote]
很久不见了。
xwfde 2011-01-31
  • 打赏
  • 举报
回复
看微软的代码基本没有枚举,事实上我没发现过一处枚举,总之我不用枚举,VC也不支持枚举的一些特性,别用了吧
jackzhhuang 2011-01-31
  • 打赏
  • 举报
回复
能用枚举尽量使用枚举,否则使用宏,跟踪代码的时候看到的都是数字,这样就得费脑力去记数字的意义,我遇到这种情况很想骂人的。
maoloverme1 2011-01-31
  • 打赏
  • 举报
回复
请看《Effective C++》第三版的第02条款,写的很清楚。
FrankHB1989 2011-01-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 supermegaboy 的回复:]

引用楼主 suolaisi 的回复:
为什么要有枚举类型?枚举类型和define定义出来的常量有什么区别?


枚举常量与宏的区别主要有几点:

1。枚举常量是实体中的一种,但宏不是实体;
2。枚举常量属于常量,但宏不是常量(有些书把类对象宏称为预处理常量,这是错误的说法,标准C/C++没有预处理常量这种不知从哪里冒出来的说法);
3。枚举常量具有类型,但宏没有类型,枚举变量具有与普通变量相同的诸如作用域、值等性质,但宏没有;
[/Quote]
宏名有作用域。
注意作用域是标识符/名称的性质,不是实体的性质。

ischarles 2011-01-31
  • 打赏
  • 举报
回复
主要是为了让程序更容易阅读,如果光写数字,别人是看不懂的
qudaxiao2 2011-01-31
  • 打赏
  • 举报
回复
例:
#define ZERO(x) memset(x, 0, sizeof(x))

enum的话就不行了,只能是整形....
飞天御剑流 2011-01-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 suolaisi 的回复:]
为什么要有枚举类型?枚举类型和define定义出来的常量有什么区别?
[/Quote]

枚举常量与宏的区别主要有几点:

1。枚举常量是实体中的一种,但宏不是实体;
2。枚举常量属于常量,但宏不是常量(有些书把类对象宏称为预处理常量,这是错误的说法,标准C/C++没有预处理常量这种不知从哪里冒出来的说法);
3。枚举常量具有类型,但宏没有类型,枚举变量具有与普通变量相同的诸如作用域、值等性质,但宏没有;


枚举类型主要用于限制性输入,例如,某个函数的某参数只接受某种类型中的有限个数值,除此之外的其它数值都不接受,这时候枚举能很好地解决这个问题。
昵称很不好取 2011-01-30
  • 打赏
  • 举报
回复
define只是简单的替换,而enum是变量定义,可以检查,更安全,具体看看书,或是google吧
  • 打赏
  • 举报
回复
enum define 看书去
漫步者、 2011-01-30
  • 打赏
  • 举报
回复
枚举类型和define定义出来的常量
define 它可是是任意类型的数据
而枚举只能是整型的数据
yuppy 2011-01-30
  • 打赏
  • 举报
回复
枚举类型 只接受分配时预先定义的值集合,方便操作一些变量呗
1) 本套课程针对高校大学生系统学习C语言而录制,从0基础入门讲起,循序渐进,通俗易懂,同时适用于计算机系及非计算机系的同学。通过学习可以帮助大家掌握C语言本质,轻松面对C语言全国二级考试,并达到能独立完成中型C项目、C游戏的水平;2) 多数高校都开设了C语言课程,网上C语言课程也很多,但普遍存在两个问题: (1) 授课方式单一,大多是照着代码念一遍, 对刚刚接触编程的同学来说,感觉晦涩难懂 (2) 授课内容过度注重语法,没有项目实战支撑,造成课程枯燥无趣。本课程针对上述问题进行了改进 (1) 授课方式采用语法讲解+内存布局示意图+项目的方式,让课程生动有趣好理解 (2) 系统全面的讲解了C语言的核心技术点,还配套录制了《全国计算机二级C语言真题精讲》,让学员在掌握C语言编程的同时,还能轻松面对二级考试;3) 课程详细内容: 常量-变量、分支语句、循环语句、操作符和表达式、函数(库函数、自定义函数、递归调用 )、数组(一维数 组、二维数组、数组作为函数参数、指针数组)、指针(指针和指针类型、二级指针和多级指针、指针表达式解析、指针运算、数 组指针、函数指针、回调函数)、调试技巧、程序环境和预处理(翻译环境、运行环境、预定义符号、#define和#undef、宏和函 数、条件编译、文件包含)、 数据在内存中的存储、内存块分配、static、字符函数和字符串函数、自定义类型(结构体、枚举 、联合)、动态内存管理、文件操作(i/o常量、i/o函数、流)。

69,394

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧