枚举类型 - C

枚举类型

文章编写遵循 " why - what - how - how to good "

Why - 😑😐😶


枚举可以让数据更易读、更简洁。

  • 有含义的数字和直接描述的文字,哪个更易读?当然是后者!

    switch (color_number) 
    {
        case 1: printf("red\n"); break;
        case 2: printf("blue\n"); break;
        case 3: printf("green\n"); break;
    }
    -----------------------------------------
    enum color {
        red = 1, blue, green
    } color;
    switch (color_name)
    {
        case red: printf("red\n"); break;
        case blue: printf("blue\n"); break;
        case green: printf("green\n"); break;
    }
    
  • 枚举类型更可以看做是宏定义的精简版,前者只能宏替换掉 int 类型和 unsigned int 类型;后者,可替换任意类型。

    #define Monday 1
    #define Tuesday 2
    #define Wednesday 3
    #define Thursday 4
    #define Friday 5
    #define Saturday 6
    #define Sunday 7
    ------------------------------------------
    enum Day {
        Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun
    } day;
    

What


枚举类型就是精简版的宏定义

emmm,这里打个比方哈,这枚举其实就有点像我们玩游戏时的那些小型增幅矩阵,对控制范围内的空间进行增幅强化,或是优化。

eg:将空间内的数字(1, 2, 3…)替换成设定好的名字 (red, blue, green…)

enum color {
    red = 1, blue, green
};

此外,在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的。

定义格式
enum Day {
    Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun
} day; // void;

enum Day {Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun} day;

enum {
    Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun
} day;	// 类似于结构体的定义规则

要注意:"{ }" 里面的是没有 “;”(分号)的。

枚举格式的语法

1.在定义时,"{ }" 内的变量都可以不进行初始化。第一个会默认为 “0”,后续的枚举变量会一次累加

2.任意一个位置的枚举变量被复制初始化后,后续的枚举都会在其基础上进行累加

enum day {
    Mon0, Tue, Wed, Thu, Fri, Sat, Sun
};
>>> Mon = 0
    Tue = 1
    Wed = 2
    Thu = 3
    Fri = 4
    Sat = 5
    Sun = 6
----------------------------------------------    
enum day {
    Mon, Tue, Wed = 10, Thu, Fri, Sat, Sun
};
>>> Mon = 0
    Tue = 1
    Wed = 10
    Thu = 11
    Fri = 12
    Sat = 13
    Sun = 14
语句的编写位置

在这方面上,枚举和宏定义有些区别,枚举类型语句可以在任意位置编写代码,但宏定义只能在函数体之外进行编写。

对于这方面,可以认为是精简版带来的好处,就好比游戏中,小型增幅矩阵可以到处带着跑,大哥大只能家里蹲 : )

How


普通用法:
#include <stdio.h>

enum Day {
    Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun
};

int main(void) {
    Day day;
    day = Mon;
    printf("day = %d\n", day);
    
    return 0;
}
枚举遍历:

要注意:枚举能够遍历的前提是,枚举变量的大小必须是线性增加的

#include <stdio.h>

enum Day {
    Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun
};

int main(void) {
    Day day;
    for (day = Mon; day <= Sun; day++) {
        printf("day = %d\n", day);
    }
    
    return 0;
}
>>>
    day = 1
    day = 2
    day = 3
    day = 4
    day = 5
    day = 6
    day = 7

How To Good - 🙃???


如果想要精进某一类技能,就必须深入了解它的本质

What exactly is an enumeration type in a computer?
枚举类型在计算机中到底是什么?

在我们对枚举类型的变量进行 printf() 输出操作的时候,发现它对应的格式化语法是 “%d”,从这可以看出,C 语言将这种类型的变量当做 int 类型进行处理。

测试程序 - 1.0:

#include <stdio.h>

enum Day {
    Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun
};

int main(void) {
    Day day;
    day = Mon;
    printf("day = %d\n", day);
    printf("Mon = %d\n", Mon);
    printf("sizeof(day) = %d\n", sizeof(day));
    printf("sizeof(int) = %d\n", sizeof(int));
    if (day == 1)
        printf("enum == int");
    else 
        printf("enum != int");
    
    return 0;
}
>>> day = 1
    Mon = 1
    sizeof(day) = 4
    sizeof(int) = 4
    enum == int

从结果来看:

  1. 从 day == Mon 的值可以得出,定义时枚举体中的变量也属于枚举变量。对于 day 与 Mon 的区别,可能就只是 day 枚举变量是为了处理 Mon 类变量而存在的,就类似于操作指针的存在,不存在也没事,Mon 它们是可以直接使用的。
  2. enum 支持与 number 类的数据类型进行比较
  3. 枚举类型变量在内存中的大小和 (int) and (unsigned int) 的大小相等

测试程序 - 2.0:

enum Day {
    Mon = -1, Tue, Wed, Thu, Sat, Sun
} day;

printf("Mon = %d\n", Mon);
printf("Tue = %d\n", Tue);

>>> Mon = -1
    Tue = 0

从结果来看:

  • enum 支持变量的值为 负,即:支持有符号

最后的唠叨:

枚举类型虽然被 C 语言视作 int or unsigned int 类型来处理,但是它们仍然是不同类型的,要注意类型的转换。

enum Day {Mon = 1, Tue, Wed, Thu, Fri} day;
int i = 10;
Fri = (enum Day) i;

以上的内容和思考,是单纯在阅读学习资料时所得的,肯定会存在很大的局限性,以及不足。到这里文章并没有完结,只是剩余的部分,需要我们自己用实践和经历去完善和补足!

大家加油 : )

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值