C语言枚举详解

C语言枚举详解C 语言枚举详解

枚举的引入

枚举是C语言中的一种基本数据类型,它可以让数据更简洁,更易读。

枚举语法定义格式为:

​​​​​​​enum 枚举名 { 枚举元素1,枚举元素2,…… //注意,各元素之间用逗号隔开 }; //注意,末尾有分号;

编译器自动分配的原则是:从0开始依次增加。如果用户自己定义了一个值,则从那个值开始往后依次增加。

C语言为何需要枚举?

C语言没有枚举是可以的。使用枚举其实就是对一些数字进行符号化编码,这样的好处就是编程时可以不用看数字而直接看符号。符号的意义是显然的,一眼可以看出。而数字所代表的含义除非看文档或者注释。

这么看来,宏定义也能实现呀!要专门弄个枚举类型干嘛?

宏定义和枚举有内在联系,宏定义和枚举经常用来解决类似的问题,他们俩基本相当可以互换,但是有一些细微差别。

宏定义示例:

#define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI 5 #define SAT 6 #define SUN 7

枚举示例:

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };

总结:宏定义先出现,用来解决符号常量的问题;后来人们发现有时候定义的符号常量彼此之间有关联(多选一的关系),用宏定义来做虽然可以但是不贴切,于是乎发明了枚举来解决这种情况。

类型定义和变量声明

枚举类型需要先定义后使用,这里的定义是类型的定义,不是枚举变量的定义。

既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。

方法一:枚举类型的定义和变量的声明分开

//先定义类型 enum DAY //类型名称就是enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; //后声明变量 enum DAY yesterday; enum DAY today; enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY enum DAY good_day, bad_day; //变量good_day和bad_day的类型均为枚举型enum DAY 

方法二:类型定义与变量声明同时进行

enum //跟第一个定义不同的是,此处的标号DAY省略,这是允许的。 { saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday } workday; //变量workday的类型为枚举型enum DAY //变量days的类型为枚举型enum week enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //定义枚举类型并声明了两个枚举型变量 enum BOOLEAN { false, true } end_flag, match_flag; 

第二种方式的变量定义是一次性的,后面要想再定义同类型变量就不行了。

第一种方式更灵活。

方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明

typedef enum workday { saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday } workday; //此处的workday为枚举型enum workday的别名 //或者 //enum workday中的workday可以省略 typedef enum { saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday } workday; //此处的workday为枚举型enum workday的别名 //定义变量 //变量today和tomorrow的类型为枚举型workday,也即enum workday workday today, tomorrow; 

注意:

同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。

使用枚举变量

1、先声明后赋值(常用)

#include 
   
     /* 定义枚举类型 */ enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; void main() { /* 使用基本数据类型声明变量,然后对变量赋值 */ int x, y, z; x = 10; y = 20; z = 30; /* 使用枚举类型声明变量,再对枚举型变量赋值 */ enum DAY yesterday, today, tomorrow; yesterday = MON; today = TUE; tomorrow = WED; printf("%d %d %d \n", yesterday, today, tomorrow); } 
   

就像各种类型都有取值范围一样,枚举变量只能接收枚举类型中定义好的符号值(实质是一个int类型的数据)。

2、声明的同时赋值

#include 
   
     /* 定义枚举类型 */ enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; void main() { /* 使用基本数据类型声明变量同时对变量赋初值 */ int x=10, y=20, z=30; /* 使用枚举类型声明变量同时对枚举型变量赋初值 */ enum DAY yesterday = MON, today = TUE, tomorrow = WED; printf("%d %d %d \n", yesterday, today, tomorrow); } 
   

3、类型定义、变量声明和赋值同时进行(不推荐,会引入全局变量)

#include 
   
     /* 定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量 */ enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } yesterday = MON, today = TUE, tomorrow = WED; /* 定义三个具有基本数据类型的变量,并赋初值。它们都为全局变量 */ int x = 10, y = 20, z = 30; void main() { printf("%d %d %d \n", x, y, z); //输出:10 20 30 printf("%d %d %d \n", yesterday, today, tomorrow); //输出:1 2 3 } 
   

补充

对枚举型的变量可以直接赋任意整数值,如果赋值浮点数,也会自动去掉小数部分。

赋整数值时,可直接赋值,因为枚举的本质就是整型(int)数据的集合。

#include 
   
     int main() { enum week { MON, TUE, WEN }; enum week oneday = 100; printf("%d,Hello, World! \n", oneday); //100,Hello, World! } 
   

其实,更正规的做法是进行显式的强制类型转换:

#include 
   
     int main() { enum week { MON, TUE, WEN }; enum week oneday = (enum week)100; printf("%d,Hello, World! \n", oneday); //100,Hello, World! } 
   

但是不强制转换也可以,和第一个示例一样,不加的话就是隐式类型转换,不会出错。

枚举变量既可以定义变量使用,也可以直接使用:

#include 
   
     int main() { enum week { MON, TUE, WEN }; enum week oneday = MON; printf("%d,Hello, World! \n", oneday); //0,Hello, World! printf("%d,Hello, World! \n", WEN);//2,Hello, World! } 
   

直接使用枚举的情况更常见,因为一旦通过变量,那么就可以赋任何值,那就失去了枚举的意义了,本来枚举就是为了放一些特定整数集合的数据类型,值一般是固定的,比如对错、比如星期、比如状态等等。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206946.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午3:08
下一篇 2026年3月19日 下午3:08


相关推荐

  • I bumped into a girl literally_back and forth

    I bumped into a girl literally_back and forthhttp://acm.hznu.edu.cn/OJ/problem.php?cid=1263&pid=6http://acm.hznu.edu.cn/OJ/problem.php?id=2585题意:每天能往存钱罐加任意实数的钱,每天不能多于起那一天放的钱数。如果某一天的钱数恰好等于那天的特价商品,则可以买,求最后的最大快乐值。题解:显然的贪心:如果第i天买完,准备在第…

    2025年8月12日
    5
  • Android手机9008模式刷机教程(以小米手机为例)

    Android手机9008模式刷机教程(以小米手机为例)机型 红米 1s 电信版故障 一开始可以进入 fastboot 后来无法进入 fastboot 无限重启 后来开机键无反应 大家都知道 刷机的方式有很多种 大体来讲 我们刷机一般采用以下几种方式 1 卡刷 即进入 recovery 模式操作手机将 SD 卡上的刷机包刷入手机 完成刷机过程 2 线刷 当手机无法进入 recovery 的时候只能线刷了 即进入 fastboot 下载模式 用线刷软件在电脑

    2026年3月18日
    2
  • [Slimdx]顶点和索引缓冲,绘制了2个分离的三角形

    [Slimdx]顶点和索引缓冲,绘制了2个分离的三角形定义网格顶点和索引缓冲 绘制了 2 个分离的三角形 1usingSystem 2usingSystem Drawing 3usingRGeos SlimScene Core 4usingSlimDX 5usingSlimDX Direct3D9 6usingCustom 7usingRGeos Ap

    2026年3月18日
    1
  • java怎样调用oracle存储函数_oracle如何调用存储过程

    java怎样调用oracle存储函数_oracle如何调用存储过程之前给大家介绍了java代码调用存储过程,下面要给大家介绍的就是java当中调用oracle存储过程,一起来看看吧。首先来看一下项目结构:在数据库创建存储过程的脚本,假如,使用的是本地的oracle数据库,那么,就需要开启服务-OracleOraDb11g_home1TNSListener和OracleServiceORCL。实现:输入用户的工号,输出用户名字、薪水以及工作:createorr…

    2022年10月20日
    4
  • 大数据计算框架有哪些_高中物理知识框架图

    大数据计算框架有哪些_高中物理知识框架图前言大家好,我是土哥写文章整整五个月了,在这期间写了很多篇高质量文章,每一篇都在1000+阅读以上,为了让各位小伙伴更好的学习和面试,我将自己发表的文章以及未发表的文章全部汇总成一个文档,里面包含了全部的无水印高清图片,具体内容如下:关注公众号:【3分钟秒懂大数据】,回复关键字:【大数据】,进群领取下文全部PDF文件。1、大数据学习路线文章硬不硬核,你说了算,土哥怒肝大数据学习路线一条龙!(万字长文+资源分享)上述文章将所有组件的安装包全部都收集好,版本

    2025年7月31日
    5
  • 基于Ernie-Bot打造智能语音对话系统:技术实现与场景应用指南

    基于Ernie-Bot打造智能语音对话系统:技术实现与场景应用指南

    2026年3月12日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号