C语言学习记录——枚举(定义、与结构体的区别、优点)

简介: C语言学习记录——枚举(定义、与结构体的区别、优点)

简单介绍

枚举顾名思义就是一一列举,把可能的值一一列举,比如我们现实生活中:一周的星期日到星期六是有限的7天,可以一一列举;性别有:男、女、保密,也可以一一列举;月份有12个,也可以一一列举。

枚举类型的定义

#include <stdio.h>
enum Day
{
    Mon,   //0
    Tues,  //1
    Wed,   //2
    Thur,  //3
    Fri,   //4
    Sat,   //5
    Sun    //6
};
enum Sex
{
    MALE = 5, //5
    FEMALE,   //6
    SECRET    //7
};
int main()
{
    enum Day d = Mon;
    printf("%d\n", d);
    enum Sex s = SECRET;
    printf("%d\n", s);
    return 0;
}

以上定义的enum Day,enum Sex都是枚举类型。{}里的内容是枚举类型的可能取值,也叫枚举常量。


这些可能取值都是有值的,默认从0开始,依次递增1,在定义的时候也可以赋初值。enum Sex中就是赋了初始值的。上面的代码运行起来的结果为:

枚举和结构体的区别

我们可以从他们的大小来验证这一点,例如:

#include <stdio.h>
enum Sex
{
    MALE , 
    FEMALE,   
    SECRET    
};
struct S
{
    char c1;
    char c2;
    int n;
};
int main()
{
    printf("int = %u\n", sizeof(int));
    printf("enum Sex = %u\n", sizeof(enum Sex));
    printf("struct S = %u\n", sizeof(struct S));
    return 0;
}

因为枚举类型中的枚举常量是整型,所以枚举类型的大小与int大小一致

代码运行结果为:

枚举的优点

我们可以使用#define定义常量,为什么非要用枚举?

因为枚举有许多优点:

1.增加代码的可读性和可维护性。 2.和#define定义的标识符比较,枚举有类型检查,更加严谨。

3.防止了命名污染(封装)。

4.便于调试。

5.使用方便,一次可以定义多个常量。


着重解释一下第3、4点。

防止命名污染

在枚举类型中定义的枚举常量,它是属于枚举类型范围内的;而如果用#define定义的则是属于全局的。

命名污染:如果定义了一个变量,在哪里都能被使用(全局),那么在使用它的过程中容易与其他相同名字的变量产生冲突,这种情况就叫做命名污染。


便于调试

总结

在可以使用#define定义和枚举类型定义的时候,我们都建议优先使用枚举类型,而不是#define定义。枚举类型的大小等于int的大小,使用枚举会更严谨一些。

目录
相关文章
|
21天前
|
C语言
枚举(C语言)
枚举(C语言)
|
21天前
|
网络协议 编译器 Linux
结构体(C语言)
结构体(C语言)
|
9天前
|
存储 编译器 定位技术
结构体数组在C语言中的应用与优化策略
结构体数组在C语言中的应用与优化策略
|
15天前
|
存储 编译器 数据库
结构体数组在C语言中的应用与优化技巧
结构体数组在C语言中的应用与优化技巧
|
20天前
|
存储 C语言
C语言中的typedef关键字:为类型定义新名称
C语言中的typedef关键字:为类型定义新名称
20 0
|
20天前
|
编译器 C语言
C语言枚举:深入探索下标默认值、自定义值及部分自定义情况
C语言枚举:深入探索下标默认值、自定义值及部分自定义情况
11 0
|
20天前
|
C语言
C语言中的结构体
C语言中的结构体
9 0
|
21天前
|
C语言
|
22天前
|
编译器 C语言 C++
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
11 0
|
C语言
《C语言及程序设计》实践项目——枚举应用
返回:贺老师课程教学链接 【项目1-对称点】 设计函数,可以按指定的方式,输出一个平面点的对称点 下面给出枚举类型定义和main函数(测试函数),请写出output函数的实现。 #include&lt;stdio.h&gt; enum SymmetricStyle {axisx, axisy, point};//分别表示按x轴, y轴, 原点对称三种方式 void
1078 0