C语言 - 枚举

枚举

1 - 如果我们在程序中利用预处理指令 #define 来完成这项工作,代码可能是

#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7

其实可以定义一种新的数据类型,也能够完成同样的工作,这种新的数据类型叫枚举型。说白了,枚举型是预处理指令 #define 的替代

2 - 枚举型是一个集合,集合中的元素是一些命名的整型常量,元素之间用逗号隔开。第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上 +1。如果人为地改变某个枚举成员的值为,那么其后续枚举成员的值是在它基础上 +1

3 - 如何使用枚举

① 方式一:枚举定义和变量的声明分开来

复制代码
enum DAY{
    MON,// 0
    TUE,// 1
    WED,// 2
    THU = 101, // 改变默认值
    FRI,// 102
    SAT,// 103
    SUN // 104
};
enum DAY someDay;// someDay 才是枚举变量
复制代码

② 方式二:枚举定义与变量声明同时进行

复制代码
// DAY 可省略
enum DAY{
    MOND,
    TUED,
    WEDD,
    FRID,
    SATD,
    SUND
}someDay; // 枚举变量
复制代码

③ 方式三:使用 typedef 关键字

// WORKDAY 可省略
typedef enum WORKDAY{    
    monday,
    tuesday,
    wednesday,
    thursday,
    friday
}WD;// 需要注意的是:WD 是枚举别名,而非枚举变量

④ 定义枚举类型时可以声明多个枚举型变量

enum BOOLEAN{
    isFale,
    isTrue
}end_flag,match_flag;

枚举变量

1 - 初始化

① 方式一:先声明枚举,再对变量赋值

enum DAY{
    MON=1,  TUE,    WED,    THU,    FRI,    SAT,    SUN
};
// 声明枚举类型变量并赋值
enum DAY yesterday, today, tomorrow;

yesterday = MON;
today     = TUE;
tomorrow  = WED;
printf("%d %d %d \n", yesterday, today, tomorrow);

② 方式二

enum DAY{
    MON=1,  TUE,    WED,    THU,    FRI,    SAT,    SUN
};
enum DAY yesterday = MON,   today = TUE,    tomorrow = WED;
printf("%d %d %d \n", yesterday, today, tomorrow);

③ 方式三:定义枚举的同时声明变量

enum DAY{
    
    MON=1,  TUE,    WED,    THU,    FRI,    SAT,    SUN
}yesterday, today, tomorrow;// 枚举变量
yesterday = MON;
today     = TUE;
tomorrow  = WED;
printf("%d %d %d \n", yesterday, today, tomorrow); // 输出 1 2 3

④ 方式四:枚举定义、变量声明和赋初值同时进行

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

2 - 对枚举变量赋整数值时,需类型转换(建议)

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
enum DAY yesterday, today, tomorrow;
yesterday = TUE;
today = (enum DAY) (yesterday + 1);// 类型转换
tomorrow = (enum DAY) 30;          // 类型转换
tomorrow = 90;// 不建议直接赋值,但现实中我们往往如此

3 - 代码示例:存在一字符串 I'm Ely efo d ,请检测出空格数和字母的个数

复制代码
 1 #include <stdio.h>
 2 enum{
 3     BELL          = '\a',
 4     BACKSPACE     = '\b',
 5     HTAB          = '\t',
 6     RETURN        = '\r',
 7     NEWLINE       = '\n',
 8     VTAB          = '\v',
 9     SPACE         = ' '
10 };
11 
12 enum BOOLEAN{
13     FALSEF ,
14     TRUET
15 } match_flag;
16 
17 int main(int argc, const char * argv[]) {
18     
19     int index = 0;
20     int count_of_letter = 0;
21     int count_of_space = 0;
22     
23     char str[] = "I'm Ely efo d";
24     match_flag = FALSEF;
25     for(; str[index] != '\0'; index++)
26         
27         if( SPACE != str[index] )
28             count_of_letter++;
29         else{
30             match_flag = TRUET;
31             count_of_space++;
32         }
33     printf("%s %d times %c", match_flag ? "match" : "not match", count_of_space, NEWLINE);
34     printf("count of letters: %d %c%c", count_of_letter, NEWLINE, RETURN);
35     
36     return 0;
37 }
复制代码

日志信息

小结

1 - 枚举就是在其相应作用域内的一个标识符而已,编译器根本不知道什么是枚举这个东西

2 - 枚举对于编译器来说就是 int 类型的值而已,只不过是个常量 int,枚举的一切行为表现都与一个普通的 int 值没有区别

3 - 枚举变量所占的字节数等同于 int,统统是 4 字节大小

posted on   低头捡石頭  阅读(41)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示