1、
枚举类型:即列举
枚举类型的特点:
(1) 枚举类型是一个受到限制的有符号的类型;
(2)枚举值(元素)必须是整型值(有符号);//char 类型可以是‘A’,short类型可以,不允许字符串“abc”,float double 指针
(3)枚举变量的取值必须在枚举值的集合中;
注:给枚举值赋的值可以重复,但枚举值(元素)不可以重复
枚举的优点:
(1)增加代码的可读性和可维护性;
(2)和宏不同,枚举有类型检查更安全;
(3)封装性好;
(4)便于调试;
(5)使用方便,一次可以定义多个变量;
2、定义
enum+名字+{变量};
eg: enum Week{Mon,Tue,Wed,Thu,Fri,Sat,Sun};
//不指定值,枚举值默认从0开始,往后逐个递增+1
enum Week{Mon,Tue,Wed,Thu,Fri,Sat,Sun};
//不指定值,枚举值默认从0开始,往后逐个递增+1
int main()
{
enum Week day = Mon;
printf("%d\n", day);
return 0;
}
结果:
enum Week{Mon=1,Tue=2,Wed=3,Thu=4,Fri=5,Sat=6,Sun=7};
//全部给值,枚举值为给定的值
enum Week{Mon,Tue,Wed=5,Thu,Fri=8,Sat,Sun};
//可以给一部分,没给的枚举值等于前一个值+1,第一个值默认为0;
3、枚举实例应用
在C89中没有bool类型,可以用枚举来写
typedef enum { TRUE = 1, FALSE = 0, PIR_NULL = -1 } My_Bool;//定义一个枚举,取别名为My_Bool
My_Bool Finf_ArrVal(int* arr, int len, int val)//找数组中的一个数val
{
if (arr == NULL)
{
return PIR_NULL;
}
for (int i = 0; i < len; i++)
{
if (val == arr[i])
{
return 1;
}
}
}
4、位域
//位段:位域
struct A
{
char a : 3;//代表占3个位,有符号
char b : 2;//代表占2个位
char c : 5;//代表占5个位
char d : 4;//代表占4个位
};
int main()
{
printf("%d\n", sizeof(A));//char 类型1个字节8个位,a占3个位,还剩5个位,可以放下b,b放完还剩3个位,放不下c,所以需要重新开辟一个字节,放c,放完c第2个字节放不下d,继续开辟一个字节,因此结构体A一共占3个字节
return 0;
}
struct B
{
char a : 3;
char b : 2;
char c : 5;
char d : 4;
};
int main()
{
struct B aaa = {0};
aaa.a = 7;//a的值为7,2进制位111,a占3个位,都能看见,最高位为1,负数,取反加一,-(001)即为1
aaa.b = 6;//b=6,6的二进制110,但是b只占2个位,所以只能看到后两位,即10,第1位为1,代表符数,取反加1,变为-(10)即-2
return 0;
}