1、定义枚举
enum
是C语言中的一个关键字,enum
叫枚举数据类型,枚举数据类型描述的是一组数据的集合,枚举型是预处理指令#define
的替代,枚举和宏定义其实非常类似,宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值,
枚举数据(枚举常量)是一些特定的标识符,标识符代表什么含义,完全由程序员决定。数据枚举的顺序规定了枚举数据的序号,默认从0
开始,依次递增。
1)先声明后定义
#include <stdio.h> enum RGB { R,G,B }; int main() { enum RGB rgb=G; printf("%d\n",rgb); return 0; }
2)同时声明和定义
#include <stdio.h> int main() { enum RGB { R,G,B } rgb; rgb=B; printf("%d\n",rgb); return 0; }
3)直接定义
#include <stdio.h> int main() { enum { R,G,B } rgb; rgb=B; printf("%d\n",rgb); return 0; }
枚举值默认是从0开始,也可以显示指定。
例如,
#include <stdio.h> int main() { enum { R=2,G,B } rgb; rgb=B; printf("%d\n",rgb); return 0; }
2、枚举使用示例
定义星期枚举类型,并将初始值指定为1。
例如,
#include<stdio.h> /* 定义枚举类型 */ enum DAY { MON=1,TUE,WED,THU,FRI,SAT,SUN}; void main() { /* 使用枚举类型声明变量,再对枚举型变量赋值 */ enum DAY yesterday, today, tomorrow; yesterday = MON; today = TUE; tomorrow = WED; printf("%d %d %d \n", yesterday, today, tomorrow); }
3、枚举转换
枚举类型和int类型可以转换,我们可以转将int类型转换成枚举类型。
例如,
#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; //类型转换 printf("%d %d %d \n",yesterday,today,tomorrow);//输出:2 3 30 }
4、枚举的高级用法
枚举(enum
)的高级用法可以帮助开发者更好地管理和组织代码。除了基本的定义和使用方式之外,枚举还可以结合其他C语言特性,如位运算、枚举大小控制、以及与结构体和联合体的结合使用。
1)使用枚举进行位运算(位标志)
枚举结合位运算通常用于定义标志(flags),例如权限或状态的组合。每个枚举值被定义为一个二进制位,这样可以通过按位与(&
)、按位或(|
)、按位取反(~
)来操作标志。
#include <stdio.h> // 使用枚举定义文件权限标志 enum FilePermissions { READ = 1 << 0, // 0001 WRITE = 1 << 1, // 0010 EXECUTE = 1 << 2 // 0100 }; // 检查权限 void checkPermissions(int permissions) { if (permissions & READ) { printf("Read permission is set.\n"); } if (permissions & WRITE) { printf("Write permission is set.\n"); } if (permissions & EXECUTE) { printf("Execute permission is set.\n"); } } int main() { int permissions = READ | WRITE; // 设置读和写权限 checkPermissions(permissions); return 0; }
2)使用枚举作为结构体成员
枚举和结构体的结合使用非常常见。枚举用于定义状态、类型或模式,而结构体则用于保存相关的数据。
#include <stdio.h> // 定义网络包的类型 enum PacketType { DATA, ACK, CONTROL }; // 定义一个网络包的结构体 struct Packet { enum PacketType type; // 包的类型 int size; // 包的大小 }; // 打印包信息 void printPacketInfo(struct Packet p) { printf("Packet size: %d\n", p.size); switch (p.type) { case DATA: printf("Packet type: DATA\n"); break; case ACK: printf("Packet type: ACK\n"); break; case CONTROL: printf("Packet type: CONTROL\n"); break; } } int main() { struct Packet p1 = {DATA, 100}; // 数据包 struct Packet p2 = {ACK, 10}; // 确认包 printPacketInfo(p1); printPacketInfo(p2); return 0; }