枚举常量基本要素
枚举常量的声明符
我们使用enum关键词来创建一个新的类型,这个类型里面包含了多个元素。
我们利用enum创建一个新的枚举类型。这里有两个注意的点,第一,每一个枚举元素后面是英文逗号','如果你写成了分号“;”或者中午的逗号“,”都会出现问题。第二,每次建立完枚举类型之后,都需要在大括号{}后面加一个分号“;”
enum color { red, green, yellow };
枚举常量的默认值
枚举常量默认值是0,1,2依次递增的。
#include <stdio.h> enum color { red, green, yellow }; int main() { printf("%d\n", red); //0 printf("%d\n", green); //1 printf("%d\n", yellow);//2 return 0; }
枚举常量的赋值
但是如果我们想给他们赋值,这样写
enum color { red = 2, green = 4, yellow = 8 };
但是我们又需要注意,如果只给其中一个枚举常量赋值,但是后面的值没有被赋予。那么后的常量会根据被赋予值开始,依次递增。而被赋值前的值从0开始递增。
#include <stdio.h> enum color { red, black, green = 4, yellow }; int main() { printf("%d\n", red); //0,被赋予值之前的从0开始递增 printf("%d\n", black); //1 printf("%d\n", green); //4,被赋予值之后,从赋予值开始递增 printf("%d\n", yellow); //5 return 0; }
枚举常量的引用
枚举常量的使用
有了枚举常量之后,我们可以这样使用。这样能够方便的得知我所选择的颜色是什么,并且根据所选的颜色进行相对应的操作。
#include <stdio.h> enum color { red, green, yellow }; int main() { int Select_color = red; if (Select_color == red) { printf("red\n"); } if (Select_color == green) { printf("green\n"); } if (Select_color == yellow) { printf("yellow\n"); } return 0; }
枚举常量的应用
但是这个时候有人又会觉得,感觉上面所说的不足以让他信服。据我所知,枚举常量在嵌入式中出现比较方便。看下面图片,我们有一个IE中断运行寄存器。从最低位B0到最高位B7,有七个bit位。每一位表示进行一个操作,很明显我们难以记下来。那怎么办呢?枚举就是最好的办法
如下为枚举之后的代码。很明显,如果我们想打开寄存器中的某一个位,就不需要再去看数据手册了,直接根据这个枚举就很轻松的可以随意操作。
#include <stdio.h> enum IE { EX0 = 0x01,//0000 0001 ET0 = 0x02,//0000 0010 EX1 = 0x04,//0000 0100 ET1 = 0x08,//0000 1000 ES = 0x10,//0001 0000 ET2 = 0x20,//0010 0000 Retain = 0x40,//0100 0000 EA = 0x80 //1000 0000 }; int main() { int Select_IE = EX0; if (Select_IE == EX0) { printf("EX0\n"); } if (Select_IE == ET0) { printf("ET0\n"); } if (Select_IE == EX1) { printf("EX1\n"); } return 0; }
枚举常量需要注意的地方
不能对枚举常量赋值
我们不能对枚举常量赋值,只能讲他们的值赋给其他变量。这个时候有人会有疑惑了,怎么不能赋值呢?明明上面不是说了给枚举常量赋值了吗?其实我们这个地方说不能给枚举常量赋值是说,不能再enum外给枚举常量赋值。
但是我们需要注意,枚举常量可以把自己的值赋予别人。
#include <stdio.h> enum IE { EX0 = 0x01,//0000 0001 ET0 = 0x02,//0000 0010 EX1 = 0x04,//0000 0100 ET1 = 0x08,//0000 1000 ES = 0x10,//0001 0000 ET2 = 0x20,//0010 0000 Retain = 0x40,//0100 0000 EA = 0x80 //1000 0000 }; int main() { EX0 = 30; //报错,表达式必须是可修改的左值 int Select_IE = EX0; //可以,枚举常量的值可以赋予其他变量 return 0; }
不能再定义与枚举常量名字相同的变量
#include <stdio.h> enum IE { EX0 = 0x01,//0000 0001 ET0 = 0x02,//0000 0010 EX1 = 0x04,//0000 0100 ET1 = 0x08,//0000 1000 ES = 0x10,//0001 0000 ET2 = 0x20,//0010 0000 Retain = 0x40,//0100 0000 EA = 0x80 //1000 0000 }; int main() { int EX0; //报错 return 0; }
不能用&取得他们的地址
#include <stdio.h> enum IE { EX0 = 0x01,//0000 0001 ET0 = 0x02,//0000 0010 EX1 = 0x04,//0000 0100 ET1 = 0x08,//0000 1000 ES = 0x10,//0001 0000 ET2 = 0x20,//0010 0000 Retain = 0x40,//0100 0000 EA = 0x80 //1000 0000 }; int main() { int* x = &EX0; //报错 return 0; }