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的大小,使用枚举会更严谨一些。

目录
相关文章
|
6天前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
26 7
|
7天前
|
编译器 C语言 C++
【C语言基础】:自定义类型(二) -->联合和枚举
【C语言基础】:自定义类型(二) -->联合和枚举
|
7天前
|
编译器 C语言
【C语言基础】:自定义类型(一)--> 结构体-2
【C语言基础】:自定义类型(一)--> 结构体
|
7天前
|
编译器 Linux C语言
【C语言基础】:自定义类型(一)--> 结构体-1
【C语言基础】:自定义类型(一)--> 结构体
|
15天前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
13 1
|
7天前
|
C语言
C语言——结构体
C语言——结构体
5 0
|
15天前
|
存储 算法 安全
数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)
数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)
16 0
|
15天前
|
程序员 C语言 C++
C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分
C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分
19 0
|
2天前
|
算法 Java C语言
Java中的算法与C语言中的函数
Java中的算法与C语言中的函数
8 2