从名字来看,枚举的意思就是列举,把可能的取值列举出来.
从我们的日常生活中来看,有很多例子:
1.一周的星期一到星期日是固定的7天,就可以列举出来.
2.从性别来看,有男,女两种.
3.月份也类似于一周,有固定的十二个月,也可以列举出来.
类似于这样的例子有很多,碰到这样的情况,我们就可以使用枚举了.
枚举类型的定义
先来看几个例子:
enum Day{ //星期
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
enum Sex{ //性别
Male,
Female
};
enum Color{ //颜色
Red,
Yellow,
Blue
};
在上面我们定义的enum Day, enum Sex, enum Color都是枚举类型.
在{}中的内容是枚举类型的可能取值,也叫作枚举常量.
枚举常量的取值默认从0开始,依次递增1,当然我们可以在定义的时候给枚举常量赋初值.比如:
enum Color{ //颜色
Red = 1,
Yellow = 2,
Blue = 4
};
枚举的优点:
1.枚举能够增加代码的可读性和可维护性
2.枚举由类型检查,更加严谨
3.便于调试
4.使用方便,可以一次定义多个常量
枚举的使用
enum Color{ //颜色
Red = 1,
Yellow = 2,
Blue = 4
};
enum Color clr = Blue; //只能拿枚举常量给枚举变量赋值
int main(){
printf("%d\n", clr);
system("pause");
return 0;
}
不能像下面这样使用
enum Color{ //颜色
Red = 1,
Yellow = 2,
Blue = 4
};
enum Color clr = Blue;
clr = 5;
int main(){
printf("%d\n", clr);
system("pause");
return 0;
}
这样就会报错,提示重定义,多次初始化
关于联合类型的定义
联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,而他们的特征就是这些成员会共用同一块空间(所以联合也叫共用体),比如:
#include <stdio.h>
#include <stdlib.h>
//联合类型的声明
union Un{
char c;
int i;
};
//联合变量的定义
union Un un;
int main(){
//计算联合变量的大小
printf("%d\n", sizeof(un));
system("pause");
return 0;
}
联合体的成员是共同运用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(联合体至少得有能力保存最大的那个成员)
#include <stdio.h>
#include <stdlib.h>
union Un{
int i;
char c;
};
union Un un;
int main(){
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
system("pause");
return 0;
}
思考一下,下面的输出结果一样吗?
printf(“%d\n”, &(un.i));
printf(“%d\n”, &(un.c));
联合体共用同一块空间,所以输出结果一样.
关于联合体大小的计算
1.联合体的大小至少是最大成员的大小.
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍.
比如:
#include <stdio.h>
#include <stdlib.h>
//关于联合体大小的计算
union Un1{
char c[5];
int i;
};
union Un2{
short c[7];
int i;
};
int main(){
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
system("pause");
return 0;
}
首先它们的最大对齐数都是4,Un1的最大成员大小为5,不是4的整数倍,所以对齐到8字节.Un2的最大成员大小为14(short类型为2字节),不是4的整数倍,所以对齐到16字节.