C语言枚举类型enum(全面详细直观)

这篇具有很好参考价值的文章主要介绍了C语言枚举类型enum(全面详细直观)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.枚举类型的定义:

维基百科的理解:枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。 定义:是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。

我的理解:枚举类型就是将一些比较固定的值一一列举出来,比如一年有十二个月,一个礼拜有七天,这是毫无疑问的,就可以将这些月份天数用常量来代替。枚举类型和宏定义是差不多的,只有细微区别,宏运行是在预处理阶段完成的,枚举类型是在与编译阶段完成的。

二.宏定义与枚举类型:

我们先用宏定义来引出枚举常量,并且说明两者的有缺点,请看下面代码:

#include <stdio.h>

#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 枚举名
{
    枚举值表
    value1,value2,value3......
};

在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。

enum是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途;枚举名(是一个标识符)是枚举类型的名字;value1, value2, value3, ......是每个值对应的名字的列表。注意最后的;不能少,枚举类型里面的枚举值默认是从0开始往后递增的.(如果第一个值被设为1,则默认从1开始递增)。

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

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 };

因为枚举值是默认从第一个的值开始递增的,所以以上代码还有一种更简洁的代码写法2:

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

三.使用枚举类型对变量声明的几种方式:

1.枚举类型的定义和变量的声明分开:

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
int main()
{
   enum DAY yesterday;
   enum DAY today;
   enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY
   enum DAY good_day, bad_day; //变量good_day和bad_day的类型均为枚举型enum DAY
}

2. 类型定义与变量声明同时进行:

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

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

typedef enum workday
{
    saturday,
    sunday = 0,
    monday,
    tuesday,
    wednesday,
    thursday,
    friday
} workday; //此处的workday为枚举型enum workday的别名
int main()
{ 
   workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday
}

//或者
typedef enum workday
{
    saturday,
    sunday = 0,
    monday,
    tuesday,
    wednesday,
    thursday,
    friday
};

workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday
//以上两种方式相同

注意:enum workday中的workday可以省略:

typedef enum
{
    saturday,
    sunday = 0,
    monday,
    tuesday,
    wednesday,
    thursday,
    friday
} workday; //此处的workday为枚举型enum workday的别名

workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday

四.枚举注意事项:

同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。错误示例如下所示:

以下代码错误,不能存在同名的枚举类型:

typedef enum
{
    wednesday,
    thursday,
    friday
} workday;

typedef enum WEEK
{
    saturday,
    sunday = 0,
    monday,
} workday;

以下错误,不能存在同名的枚举成员:

typedef enum
{
    wednesday,
    thursday,
    friday
} workday_1;

typedef enum WEEK
{
    wednesday,
    sunday = 0,
    monday,
} workday_2;

五.使用枚举类型的变量:

1.先声明变量,再对变量赋值:

#include<stdio.h>

/* 定义枚举类型 */
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);
}

运行结果如下:

c语言enum,c语言,开发语言,Powered by 金山文档

2.声明变量时同时赋值:

#include <stdio.h>

/* 定义枚举类型 */
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);
}

运行结果如下:

c语言enum,c语言,开发语言,Powered by 金山文档

3.定义类型的同时声明变量,然后对变量赋值:

#include <stdio.h>

/* 定义枚举类型,同时声明该类型的三个变量,它们都为全局变量 */
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } yesterday, today, tomorrow;

/* 定义三个具有基本数据类型的变量,它们都为全局变量 */
int x, y, z;

void main()
{
    /* 对基本数据类型的变量赋值 */
    x = 10;  y = 20;  z = 30;
    
    /* 对枚举型的变量赋值 */
    yesterday = MON;
    today     = TUE;
    tomorrow  = WED;

    printf("%d %d %d \n", x, y, z); //输出:10 20 30
    printf("%d %d %d \n", yesterday, today, tomorrow);
}

运行结果如下:

c语言enum,c语言,开发语言,Powered by 金山文档

4.类型定义,变量声明,赋初值同时进行:

#include <stdio.h>

/* 定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量 */
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
}

六.对枚举型的变量赋整数值时,需要进行类型转换。

#include <stdio.h>

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

void main()
{
    enum DAY yesterday, today, tomorrow;

    yesterday = TUE;
    today = (enum DAY) (yesterday + 1); //类型转换
    tomorrow = (enum DAY) 30; //类型转换
    //tomorrow = 3; //错误

    printf("%d %d %d \n", yesterday, today, tomorrow); //输出:2 3 30
}

七.枚举变量的大小(sizeof):

#include <stdio.h>

enum escapes
{ 
    BELL      = '\a',
    BACKSPACE = '\b',
    HTAB      = '\t',
    RETURN    = '\r',
    NEWLINE   = '\n', 
    VTAB      = '\v',
    SPACE     = ' '
};

enum BOOLEAN { FALSE = 0, TRUE } match_flag;

void main()
{
    printf("%d bytes \n", sizeof(enum escapes)); //4 bytes
    printf("%d bytes \n", sizeof(escapes)); //4 bytes

    printf("%d bytes \n", sizeof(enum BOOLEAN)); //4 bytes
    printf("%d bytes \n", sizeof(BOOLEAN)); //4 bytes
    printf("%d bytes \n", sizeof(match_flag)); //4 bytes

    printf("%d bytes \n", sizeof(SPACE)); //4 bytes
    printf("%d bytes \n", sizeof(NEWLINE)); //4 bytes
    printf("%d bytes \n", sizeof(FALSE)); //4 bytes
    printf("%d bytes \n", sizeof(0)); //4 bytes
}

八.综合示例:

#include<stdio.h>

enum Season
{
    spring, summer=100, fall=96, winter
};

typedef enum
{
    Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
Weekday;

void main()
{
    /* Season */
    printf("%d \n", spring); // 0
    printf("%d, %c \n", summer, summer); // 100, d
    printf("%d \n", fall+winter); // 193

    Season mySeason=winter;
    if(winter==mySeason)
        printf("mySeason is winter \n"); // mySeason is winter
    
    int x=100;
    if(x==summer)
        printf("x is equal to summer\n"); // x is equal to summer

    printf("%d bytes\n", sizeof(spring)); // 4 bytes

    /* Weekday */
    printf("sizeof Weekday is: %d \n", sizeof(Weekday)); //sizeof Weekday is: 4

    Weekday today = Saturday;
    Weekday tomorrow;
    if(today == Monday)
        tomorrow = Tuesday;
    else
        tomorrow = (Weekday) (today + 1); //remember to convert from int to Weekday
}

下一篇文章将会和大家分享一下联合体期待大家关注,关注。

2023.01.25

From:努力进大厂的新青年文章来源地址https://www.toymoban.com/news/detail-741022.html

到了这里,关于C语言枚举类型enum(全面详细直观)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析

    【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析

    目录 一、结构体概述及定义 1、概念 2、定义方式 方式1:先定义结构体类型,再定义结构体变量 方式2:定义结构体类型的同时定义结构体变量 方式3:定义一次性结构体 二、结构体变量的初始化 1、一般初始化 2、清空结构体变量:使用memset 3、键盘输入给结构体变量中成员

    2024年02月16日
    浏览(9)
  • C语言中enum(枚举)详解

    enum 是 enumerate(列举,枚举)一词的缩写,是 C 语言中的一种 常量 ,被称为 enumeration constant 。 enum 提供了一种很方便的方法来将值和名称关联起来,是 #define 的一种替代方法。 enum 可以看作是一种特殊的数组,是 常量组成的列表 ,而且这个常量只能是整数型。 所以如果是

    2024年02月13日
    浏览(14)
  • Rust 数据类型 之 类C枚举 c-like enum

    Rust 数据类型 之 类C枚举 c-like enum

    目录 枚举类型 enum 定义和声明 例1:Color 枚举 例2:Direction 枚举 例3:Weekday 枚举 类C枚举 C-like 打印输出 强制转成整数 例1:Weekday 枚举 例2:HttpStatus 枚举 例3:Color 枚举 模式匹配 match 表达式 枚举方法 枚举类型是一种用于表示一组有限数量相互关联的离散型数据,这些值可

    2024年02月16日
    浏览(7)
  • C语言学习笔记:枚举(enum)

    ✨博文作者:烟雨孤舟 💖 喜欢的可以 点赞 收藏 关注哦~~ ✍️ 作者简介: 一个热爱大数据的学习者 ✍️ 笔记简介:作为大数据爱好者,以下是个人总结的学习笔记,如有错误,请多多指教! 目录 简介 枚举定义 枚举变量的定义 枚举的应用 枚举enum是英文enumerate的缩写,列

    2024年02月09日
    浏览(15)
  • MarkDown学习笔记 直观全面详细

    MarkDown学习笔记 直观全面详细

    为什么我们要学习 Markdown 呢?因为 Markdown 简单易学易上手,可以以纯文本格式编写文档,然后转换成有效的HTML文档,并且以导出 HTML 、Word、图像、PDF、Epub 等多种格式的文档,许多网站平台的文章、博客、论文均可用Markdown编写文章。 使用#号标记,可以表示1-6级标题, 随

    2024年01月22日
    浏览(12)
  • 【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

    【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

    目录 1.枚举 1.1枚举优点 2.联合(共用体) 2.1联合体的应用 2.2联合体的存放 上一篇文章与大家分享并深度讨论研究了自定义类型中结构体和位段的内容,那么今天继续研究枚举和联合体的内容,希望对你有所帮助 枚举类型顾名思义就是一一列举。 把可能的取值一一列举出来

    2023年04月18日
    浏览(8)
  • 【C语言】自定义类型:结构体【结构体内存具详细】,枚举,联合

    【C语言】自定义类型:结构体【结构体内存具详细】,枚举,联合

      目录 一、结构体 1.结构的声明  2.特殊的声明 3.结构的自引用 4.结构体变量的定义和初始化   5.结构体内存对齐(重点来了) 6.为什么会存在内存对齐  7.修改默认对齐数 8.结构体传参 二、位段 1.什么是位段 2.位段的内存分配 3.位段的跨平台问题 三、枚举 1.枚举类型的定

    2024年02月07日
    浏览(13)
  • TS—枚举Enum用法

    枚举用于定义数据集合,使用枚举可以定义一些带名字的常量,有普通枚举、字符串枚举和常量枚举等类型。 普通枚举:初始值默认为 0,其余的属性按顺序依次递增。 也可手动设置初始值(其余的属性依旧按顺序递增): 字符串枚举: 常量枚举:使用 const 修饰的枚举

    2024年02月16日
    浏览(8)
  • C++枚举解读(enum)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 对于开发C++来说,枚举是一个几乎必然用到的功能。当然今天要讲的枚举肯定不是平常漫不经心的使用,而是从里到外地深扒它,逐渐揭开它神秘地面纱,发现一些未曾注意到地东西。 枚举(enumeration)类

    2024年02月13日
    浏览(7)
  • TypeScript【enum 枚举】

    TypeScript【enum 枚举】

    导语 在 TypeScript 中,新增了很多具有特性的一些数据类型处理方法, enum 【枚举】 就是其中,很具有代表性的一种,所以本章节就来聊聊 在 TypeScript 中如何去运用 enum 【枚举】 。 枚举的 概念 : 枚举(Enum)类型 用于取值被限定在一定范围内的场景 ,比如一周只能有七天

    2024年02月14日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包