c语言枚举类型enum用法参数,C语言枚举类型(Enum)

c语言枚举类型enum用法参数,C语言枚举类型(Enum)在实际编程中 有些数据的取值往往是有限的 只能是非常少量的整数 并且最好为每个值都取一个名字 以方便在后续代码中使用 比如一个星期只有七天 一年只有十二个月 一个班每周有六门课程等 以每周七天为例 我们可以使用 define 命令来给每天指定一个名字 include defineMon1 defineTues2 defineWed3 defineThurs4 defineFri

在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等。

以每周七天为例,我们可以使用#define命令来给每天指定一个名字:

#include

#define Mon 1

#define Tues 2

#define Wed 3

#define Thurs 4

#define Fri 5

#define Sat 6

#define Sun 7

int main(){

int day;

scanf(“%d”, &day);

switch(day){

case Mon: puts(“Monday”); break;

case Tues: puts(“Tuesday”); break;

case Wed: puts(“Wednesday”); break;

case Thurs: puts(“Thursday”); break;

case Fri: puts(“Friday”); break;

case Sat: puts(“Saturday”); break;

case Sun: puts(“Sunday”); break;

default: puts(“Error!”);

}

return 0;

}

运行结果:

5↙

Friday

#define命令虽然能解决问题,但也带来了不小的副作用,导致宏名过多,代码松散,看起来总有点不舒服。C语言提供了一种枚举(Enum)类型,能够列出所有可能的取值,并给它们取一个名字。

枚举类型的定义形式为:

enum typeName{ valueName1, valueName2, valueName3, …… };

enum是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途;typeName是枚举类型的名字;valueName1, valueName2, valueName3, ……是每个值对应的名字的列表。注意最后的;不能少。

例如,列出一个星期有几天:

enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };

可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues …… Sun 对应的值分别为 0、1 …… 6。

我们也可以给每个名字都指定一个值:

enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };

更为简单的方法是只给第一个名字指定值:

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };

这样枚举值就从 1 开始递增,跟上面的写法是等效的。

枚举是一种类型,通过它可以定义枚举变量:

enum week a, b, c;

也可以在定义枚举类型的同时定义变量:

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;

有了枚举变量,就可以把列表中的值赋给它:

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };

enum week a = Mon, b = Wed, c = Sat;

或者:

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;

【示例】判断用户输入的是星期几。

#include

int main(){

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;

scanf(“%d”, &day);

switch(day){

case Mon: puts(“Monday”); break;

case Tues: puts(“Tuesday”); break;

case Wed: puts(“Wednesday”); break;

case Thurs: puts(“Thursday”); break;

case Fri: puts(“Friday”); break;

case Sat: puts(“Saturday”); break;

case Sun: puts(“Sunday”); break;

default: puts(“Error!”);

}

return 0;

}

运行结果:

4↙

Thursday

需要注意的两点是:

1) 枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。

2) Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。

枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。

对于上面的代码,在编译的某个时刻会变成类似下面的样子:

#include

int main(){

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;

scanf(“%d”, &day);

switch(day){

case 1: puts(“Monday”); break;

case 2: puts(“Tuesday”); break;

case 3: puts(“Wednesday”); break;

case 4: puts(“Thursday”); break;

case 5: puts(“Friday”); break;

case 6: puts(“Saturday”); break;

case 7: puts(“Sunday”); break;

default: puts(“Error!”);

}

return 0;

}

Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用&取得它们的地址。这就是枚举的本质。

关于程序在内存中的分区以及各个分区的作用,我们将在《C语言内存》专题中的《Linux下C语言程序的内存布局(内存模型)》一节中详细讲解。

我们在《C语言switch语句》一节中讲过,case 关键字后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量,正是由于 Mon、Tues、Wed 这些名字最终会被替换成一个整数,所以它们才能放在 case 后面。

枚举类型变量需要存放的是一个整数,我猜测它的长度和 int 应该相同,下面来验证一下:

#include

int main(){

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day = Mon;

printf(“%d, %d, %d, %d, %d\n”, sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed), sizeof(int) );

return 0;

}

运行结果:

4, 4, 4, 4, 4

枚举类型enum详解——C语言

enum enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶 …

[编程] C语言枚举类型(Enum)

C语言枚举类型(Enum):定义形式为:enum typeName{ valueName1, valueName2, valueName3, …… };enum 类型名{名字1,名字2} 枚举 …

【转】java枚举类型enum的使用

原文网址:http://blog.csdn.net/wgw/article/details/ java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 …

C# 中的枚举类型 enum (属于值类型)

原文 C# 中的枚举类型 enum (属于值类型) C# 支持两种特殊的值类型:枚举和结构. 声明枚举:声明时要声明所有可能的值. using System; using System.Collect …

深入理解Java枚举类型(enum)

https://blog.csdn.net/javazejian/article/details/ 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en …

人生苦短之Python枚举类型enum

枚举类型enum是比较重要的一个数据类型,它是一种数据类型而不是数据结构,我们通常将一组常用的常数声明成枚举类型方便后续的使用.当一个变量有几种可能的取值的时候,我们将它定义为枚举类型.在Python …

全面解读Java中的枚举类型enum的使用

这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw …

Java基础之枚举类型Enum的使用

Java基础之枚举类型Enum的使用 定义 public enum AccruedCleanEnum { SPREAD(“1″,”发票”),OTHER(&quo …

《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. …

随机推荐

Control Flow 如何处理 Error

在Package的执行过程中,如果在Data Flow中出现Error,那么Data Flow component能够将错误行输出,只需要在组件的ErrorOutput中进行简单地配置,参考

SpringMVC 配置log4j

log4j.properties相关 http://www.cnblogs.com/ITEagle/archive/2010/04/23/1718365.html http://www.cnblogs …

html部分—表单、iframe、frameset及其他字符的用法(以及name、id、value的作用与区别);

/action的作用是提交到..,methed是提交方法,用po …

Windows添加在此处打开命令CMD

打开rededit在:HKEY_CLASS_ROOT > * > shell >下面新建一个项CMD 在CMD中新建两个字符串 一个是默认,值为 @shell32.dll,- 另外一 …

Android笔记——Bitmap自动取色(纯搬运)

2015/6/12更新:发现一个更好的,带demo https://github.com/MichaelEvans/ColorArt 说明: 这个是一个老外写的自动自动从bitmap中取主色与第二主色 …

jQuery的extend详解

JQuery的extend扩展方法:      Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解.      一.Jquery的扩展方 …

jdk7u79linuxx64.tar.gz下载

jdk1.7下载: 百度云盘链接:https://pan.baidu.com/s/1cQFLnS 密码:wdek

[转]Cloudera Manager和CDH5.8离线安装

https://blog.csdn.net/zzq/article/details/ https://www.cnblogs.com/felixzh/p/.h …

软件工程(FZU2015) 学生博客列表(最终版)

FZU:福州大学软件工程 张老师的博客:http://www.cnblogs.com/easteast/ 经过前两周选课,最后正式选上课程的所有学生博客如下: 序号 学号后3位 博客 1 629 li …

IntelliJ Idea 使用笔记

1. IntelliJ Idea解决Could not autowire. No beans of ‘xxxx’ type found的错误提示. 原因可能有两个,第一个是IntellijIDEA本身 …

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

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

(0)
上一篇 2026年3月17日 上午9:10
下一篇 2026年3月17日 上午9:11


相关推荐

  • 基于ARM Cortex-M和Eclipse的SWO单总线输出

    基于ARM Cortex-M和Eclipse的SWO单总线输出nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 最近在 MCUonEclipse 网站上看到 ErichStyger 所写的一篇有关通过 SWD 的跟踪接口 SWO 获取 ARMCortex M 相关信息的文章 文章结构明晰 讲解透彻 本人深受启发 特意将其翻译过来供各位同仁参考 当然限于个人水平 有不当之处恳请指正 原文网址 https mcuoneclipse com 2016 10 17 tutorial using single

    2026年3月20日
    2
  • 服务器基础知识全解(汇总版)[通俗易懂]

    服务器基础知识全解(汇总版)[通俗易懂]服务器基础知识全解(汇总版)https://www.zack.cn/archives/729本文对服务器知识进行了汇总,并添加了服务器基准测试和认证章节,内容包括9大章节,从服务器的概念、服务器重要部件技术和架构组成,并且对磁盘、RAID知识,网卡等知识做了深度详细介绍。说明:部分内容首发“智能计算芯世界”微信公众号。简单来说,服务器就是在网络中为其他客户机提供服务的计算机;具有高性能、高可靠、高IO数据传输能力等特点,企业从基础的邮件、打印到核心应用如ERP、数据库等业务,再到我们所熟

    2025年10月20日
    4
  • lm算法c语言,lm算法(lm算法原理介绍)

    lm算法c语言,lm算法(lm算法原理介绍)请问 MATLAB 中 LM 算法 Levenberg Marquard algorithm 的函数是什么 http www mathworks com matlabcentra fileexchange 16063 lmfsolve m levenberg 去看吧好像没有二维的 你最好看看这个函数 根据 LM 算法的意义修改一下计算方法 用来产生一些数据片段 例如消息或会话项 的哈

    2026年3月19日
    2
  • 采用Fuel Gauge可能出现的几种电量现象及解释

    采用Fuel Gauge可能出现的几种电量现象及解释首先应该熟悉两个变量 bat volt check point 是 UI 上面显示的值 gFG capacity by C 库仑计计算的电量值 也等于 SOC 的值 公式 DOD1 DOD0 Car Qmax DOD1 对应当前的电量值 DOD0 对应初始的电量值 Car 为 t 时间内 流过 Rfg 电阻电流的电量 Qmax 为电池的容量 下面几种情况会更新 DOD0 的值

    2026年3月17日
    1
  • RSA算法原理——(3)RSA加解密过程及公式论证

    RSA算法原理——(3)RSA加解密过程及公式论证上期(RSA简介及基础数论知识)为大家介绍了:互质、欧拉函数、欧拉定理、模反元素这四个数论的知识点,而这四个知识点是理解RSA加密算法的基石,忘了的同学可以快速的过一遍。一、目前常见加密算法简介二、RSA算法介绍及数论知识介绍三、RSA加解密过程及公式论证二、RSA加解密过程及公式论证今天的内容主要分为三个部分:rsa密钥生成过程:讲解如何生成公钥和私钥rs…

    2022年5月29日
    40
  • 八万一个月_一个月赚8万什么水平

    八万一个月_一个月赚8万什么水平我月入8万,不敢告诉朋友

    2022年4月21日
    41

发表回复

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

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