谷动谷力

 找回密码
 立即注册
查看: 1701|回复: 0
打印 上一主题 下一主题
收起左侧

C语言的枚举类型:7个问题,7个答案,7个技巧

[复制链接]
跳转到指定楼层
楼主
发表于 2024-3-5 14:07:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sunsili 于 2024-3-5 14:14 编辑

C语言的枚举类型:7个问题,7个答案,7个技巧


C语言枚举

C语言是一种强大而灵活的编程语言,它提供了多种数据类型,用于存储和操作不同种类的数据。其中一种数据类型是枚举类型,它用于表示一组有限的、互不相同的常量值。枚举类型可以让你的代码更简洁、更易读、更易维护,也可以提高程序的效率和安全性。本文将介绍枚举类型的概念、语法、用法和用途,以及一些常见的问题和技巧,希望能帮助你更好地理解和使用枚举类型。

什么是枚举类型?

枚举类型是一种用户自定义的数据类型,它由一组有名字的常量值组成,每个常量值都是一个整数。枚举类型的作用是为一组相关的常量值取一个有意义的名字,以便于在程序中使用和区分。例如,如果你要表示一周的七天,你可以定义一个枚举类型,如下:
  1. enum week
  2. {
  3. MON,
  4. TUE,
  5. WED,
  6. THU,
  7. FRI,
  8. SAT,
  9. SUN
  10. };
复制代码

这样,你就可以用MON、TUE等来代表星期一、星期二等,而不用记住它们对应的数字。这样的好处是,你的代码更容易理解和修改,也可以避免一些潜在的错误和混淆。
如何定义枚举类型?

定义枚举类型的一般格式如下:
  1. enum typeName
  2. {
  3. valueName1,
  4. valueName2,
  5. ... };
复制代码

其中,enum是一个关键字,用于声明枚举类型;typeName是枚举类型的名字,可以自己取,但要符合标识符的命名规则;valueName1、valueName2等是枚举类型的成员,也就是枚举常量的名字,它们也要符合标识符的命名规则,而且不能重复。注意,枚举类型的定义要以分号`;`结束。
定义了枚举类型后,就可以用它来声明枚举变量,如下:
  1. enum typeName varName;
复制代码


其中,varName是枚举变量的名字,可以自己取,但要符合标识符的命名规则。枚举变量的作用是存储枚举类型的一个值,也就是枚举常量的一个值。例如,如果你定义了一个枚举类型week,你可以声明一个枚举变量day,如下:
  1. enum week day;
复制代码

这样,day就可以存储`week`类型的一个值,也就是MON、TUE等中的一个。你可以用赋值语句给枚举变量赋值,如下:
  1. day = MON;
复制代码


这样,day的值就是MON,也就是星期一。你也可以在声明枚举变量的同时给它赋值,如下:
  1. enum week day = MON;
复制代码


这样,day的值就是MON,也就是星期一。你也可以在定义枚举类型的同时声明枚举变量,如下:
  1. enum week
  2. {
  3. MON,
  4. TUE,
  5. WED,
  6. THU,
  7. FRI,
  8. SAT,
  9. SUN
  10. } day;
复制代码


这样,你就同时定义了一个枚举类型week和一个枚举变量day,并且`day`的类型是week。你也可以在定义枚举类型的同时给枚举变量赋值,如下
  1. enum week
  2. {
  3. MON,
  4. TUE,
  5. WED,
  6. THU,
  7. FRI,
  8. SAT,
  9. SUN
  10. } day = MON;
复制代码


这样,你就同时定义了一个枚举类型week和一个枚举变量day,并且day的类型是week,值是MON。

枚举常量的值是什么?

枚举常量的值是一个整数,它可以由你自己指定,也可以由编译器自动分配。如果你自己指定,你可以用等号=给枚举常量赋一个整数值,如下:
  1. enum
  2. week {
  3. MON = 1,
  4. TUE = 2,
  5. WED = 3,
  6. THU = 4,
  7. FRI = 5,
  8. SAT = 6,
  9. SUN = 7
  10. };
复制代码

这样,你就给每个枚举常量都指定了一个整数值,从1到7。你也可以只给部分枚举常量指定值,如下:
  1. enum week { MON = 1, TUE, WED, THU, FRI, SAT, SUN };
复制代码

这样,你就只给第一个枚举常量MON指定了一个值,为1,而后面的枚举常量的值就是在前一个枚举常量的值的基础上加1,也就是说,TUE的值是2,WED的值是3,以此类推,直到SUN的值是7。这种方式可以让你的代码更简洁,也可以避免一些错误。
如果你没有给任何枚举常量指定值,那么编译器会自动给它们分配值,从0开始,逐个加1,如下:
  1. enum week { MON, TUE, WED, THU, FRI, SAT, SUN };
复制代码

这样,MON的值是0,TUE的值是1,WED的值是2,以此类推,直到SUN的值是6。这种方式可以让你的代码更简单,也可以符合一些编程习惯。

无论你是自己指定值,还是让编译器自动分配值,你都要注意以下几点:
- 枚举常量的值必须是一个整数,不能是一个浮点数、一个字符或一个字符串。
- 枚举常量的值不能重复,也就是说,同一个枚举类型中不能有两个枚举常量的值相同。
- 枚举常量的值不一定要连续,也就是说,你可以给枚举常量赋任意的整数值,只要不重复就行。例如,你可以这样定义一个枚举类型:
  1. enum week { MON = 1, TUE = 3, WED = 5, THU = 7, FRI = 9, SAT = 11, SUN = 13 };
复制代码

这样,每个枚举常量的值都是奇数,而且不连续。但是,这样做的好处不大,反而会让你的代码更复杂,更难理解,所以一般不推荐这样做。

如何使用枚举类型?

枚举类型的主要用途是为一组相关的常量值取一个有意义的名字,以便于在程序中使用和区分。你可以用枚举类型来表示一些有限的、互不相同的选项,例如,一周的七天、一个月的十二个月、一个班的六门课程等。
枚举类型的用途和优点

枚举类型的用途和优点有以下几点:
- 枚举类型可以让你的代码更简洁、更易读、更易维护,因为你不用记住一些无意义的数字,而是用有意义的名字来表示一组相关的常量值。例如,如果你要表示一个学生的成绩等级,你可以定义一个枚举类型,如下:
  1. enum grade { A, B, C, D, E, F };
复制代码

这样,你就可以用A、B等来代表成绩等级,而不用记住它们对应的分数范围。这样的好处是,你的代码更容易理解和修改,也可以避免一些潜在的错误和混淆。
- 枚举类型可以提高程序的效率和安全性,因为枚举类型的值都是整数,所以它们的存储和运算都很快,而且不会产生精度损失。而且,枚举类型的值都是常量,所以它们不会被修改,也不会被赋予错误的值。例如,如果你要表示一个灯的状态,你可以定义一个枚举类型,如下:
  1. enum light { ON, OFF };
复制代码

这样,你就可以用ON、OFF来代表灯的状态,而不用用0和1或者其他的数字。这样的好处是,你的程序更快更安全,也可以避免一些逻辑错误和类型错误。


枚举类型的问题和技巧

枚举类型的问题和技巧有以下几点:

- 枚举类型的值是整数,但是它们不是真正的整数类型,所以你不能直接用它们进行算术运算或者比较运算,而是要先强制转换成整数类型,如下:
  1. enum week { MON, TUE, WED, THU, FRI, SAT, SUN };
  2. enum week day = MON;
  3. int num = (int)day; // 强制转换成整数类型
  4. if (num == 0) // 比较运算
  5. {
  6. printf("Today is Monday.\n");
  7. }
复制代码

可以把枚举类型的值转换成整数类型,然后进行运算或者比较。但是,这样做的好处不大,反而会破坏枚举类型的意义,所以一般不推荐这样做。

- 枚举类型的值是常量,但是它们不是真正的常量,所以你不能用它们作为数组的大小,或者作为`case`语句的标签,而是要用宏定义来代替,如下:
  1. #define MON 0
  2. #define TUE 1
  3. #define WED 2
  4. #define THU 3
  5. #define FRI 4
  6. #define SAT 5
  7. #define SUN 6
  8. char *week[7] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}; // 用宏定义作为数组的大小
  9. int day = MON;
  10. switch (day) // 用宏定义作为case语句的标签
  11. {
  12. case MON:
  13. printf("Today is %s.\n", week[MON]);
  14. break;
  15. case TUE:
  16. printf("Today is %s.\n", week[TUE]);
  17. break;
  18. // 省略其他case语句
  19. default:
  20. printf("Invalid day.\n");
  21. break;
  22. }
复制代码

可以用宏定义来代替枚举类型的值,然后用它们作为数组的大小或者`case`语句的标签。但是,这样做的好处不大,反而会失去枚举类型的优点,所以一般不推荐这样做。

- 枚举类型的值可以和其他的枚举类型的值进行比较,但是这样做的意义不大,而且可能会引起混淆,所以一般不推荐这样做。例如,你可以这样定义两个枚举类型,如下:
  1. enum week { MON, TUE, WED, THU, FRI, SAT, SUN };
  2. enum color { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET };
复制代码

定义了两个枚举类型,分别表示一周的七天和七种颜色。但是,你不能用它们来表示一周的七种颜色,因为它们的值是不同的,而且没有任何关联。你也不能用它们来进行比较,因为它们的意义是不同的,而且没有任何依据。例如,你不能这样写:
  1. if (MON == RED) // 没有意义的比较
  2. {
  3. printf("Monday is red.\n");
  4. }
复制代码

你就在比较两个不同的枚举类型的值,这是没有意义的,而且可能会引起混淆。所以,你应该避免这样做,而是用不同的枚举类型来表示不同的概念,或者用其他的方式来表示一周的七种颜色,例如,用一个结构体或者一个数组。


+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-12-27 06:45 , Processed in 0.091298 second(s), 44 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表