目录
枚举是C语言中的基本数据类型,就是能把可能的取值一 一举例
比如:性别、星期、月份 这些情况下就可以使用枚举类型
枚举类型的语法形式:
- enum 枚举名称
- {
- 枚举元素1;
- 枚举元素2;
- ......
- };
枚举类型的定义:
- //用枚举举例星期
- enum Day//枚举的名称
- {
- Mon,
- Tues,
- Wed, // 枚举星期的所有可能
- Thur,
- Fri,
- Sat,
- Sun
- };
当然在定义的时候也可以赋初值
例如:
- enum Sex//性别
- {
- MALE = 5, //男
- FEMALE, //女
- SECRET //保密
- };
- enum Sex//性别
- {
- MALE = 5, //男
- FEMALE = 8, //女
- SECRET= 9 //保密
- };
- #define MALE
- #define FEMALE
- #define SECRET
以枚举的方式定义:
- enum sex
- {
- MALE;
- FEMALE;
- SECRET
- };
还有就是以枚举类型定义具有一定的意义
可以使用到一些程序中
- enum sex
- {
- MALE;
- FEMALE;
- SECRET
- };
- int main()
- {
- enum sex a; // 定义枚举变量
- a = MALE;
- printf("%d",a);
- return 0;
- }
- enum Day//用枚举定义星期
- {
- Mon=1, //初始化为1
- Tues,
- Wed,
- Thur,
- Fri,
- Sat,
- Sun
- };
- int main()
- {
- printf("%d\n", Mon);
- printf("%d\n", Tues);
- printf("%d\n", Wed);
- printf("%d\n", Thur);
- printf("%d\n", Fri);
- printf("%d\n", Sat);
- printf("%d\n", Sun);
- return 0;
- }
在C语言中枚举类型是被当做 int 或者 unsigned int 类型来处理的
所以按照 C 语言规范是没有办法遍历枚举类型的。
不过在一些特殊的情况下,枚举类型必须连续是可以实现有条件的遍历。
例如:
- #include
- enum DAY{
- MON=1,
- TUE,
- WED,
- THU,
- FRI,
- SAT,
- SUN
- } day;
- int main()
- {
- // 遍历枚举元素
- for (day = MON; day <= SUN; day++)
- {
- printf("枚举元素:%d \n", day);
- }
- }
- return 0;
关于枚举还有很多使用常景,需要慢慢体会
联合体也叫共用体,是一种特殊的自定义类型union
是联合体的关键字
这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合也叫共用体)
联合体语法形式:
书写的格式和结构类似
- union ud
- {
- int a;
- char b;
- };
联合体的特点:联合体成员都是使用同一块空间,每次使用空间只能选一个成员使用,不能同时使用
比如:a成员使用空间,那 b 成员就不能使用,反之b成员使用空间,那 a 成员就不能使用
例如:
下面测试联合体的大小问题
- union ud
- {
- int a;
- char b;
- };
- int main()
- {
- union ud u;
- printf("%d\n",sizeof(u));
- }
测试结果:
那么联合体的成员 a 和成员 b 的地址是否是一样的呢?
这是之前写过的判断大小端存储的问题,先在我们用联合体来判断
- int check_sys()
- {
- int i = 1;
- return *(char*)&i;
- }
- int main()
- {
- int ret = check_sys();
- if (ret == 1)
- printf("小端\n");
- else
- printf("大端\n");
- }
- int check_sys()
- {
- union s
- {
- int i;
- char c;
- }u;
- u.i = 1;
- return u.c;
- }
- int main()
- {
- int ret = check_sys();
- if (ret == 1)
- printf("小端\n");
- else
- printf("大端\n");
- }
int i
和 char c
, int i
赋值为 101 00 00 00
00 00 00 01
u .c
,因为成员u.c
是char
类型,读取的是一个字节联合体也是存在对齐的
例如:
- union Un1
- {
- char c[5];
- int i;
- };
- int main()
- {
- printf("%d\n", sizeof(union Un1));
- }
-
char c[ 5 ]
有5个元素是占5个空间,char
类型是 1 个字节int i
是整型,占 4 个字节char c[5]
所占的空间是5个, 5并不是4 的倍数例题 2:
- union Un2
- {
- short c[7];
- int i;
- };
- int main()
- {
- printf("%d\n", sizeof(union Un2));
- }
int i
是整型,占 4 个字节short c[7]
所占的空间是14个字节,14 并不是4 的倍数枚举enum就是英文enumerate的缩写,也就是列举、排列说明的意思。枚举类型是C语言中的一种特殊类型,枚举类型可以让我们的程序使用一些固定长度和固定数值的变量值范围。定义枚举类型:enum 枚举类型 {枚举值列表};
1、定义枚举类型
- //枚举颜色
- enum color{red=1, oreange=2, yellow=3, green=4, ching=5, blue=6, purple=7};
-
- //枚举一个星期的每一天
- enum week
- {
- Su, Mo, Tu, We, Th, Fr, Sa
- };
-
- //枚举每一个月
- enum month
- {
- January, February, March, April, May, June, July, August, September, October, November, December
- };
这样枚举出来的都是一推变量,引用时:
printf("%-3d %-3d %-3d %-3d %-3d %-3d %-3d", red, oreange, yellow, green, ching, blue, purple);
也就是直接使用,会直接输出对应的值。
2、定义枚举类型的变量
- enum week a, b, c;
- a = Su;
- b = Mo;
- c = Tu;
-
- enum month d, e, f;
- d = January;
- e = February;
- f = March;
3、调用枚举类型变量
每周的日期和每月份的输出也是这样:
- enum week a, b, c;
- a = Su;
- b = Mo;
- c = Tu;
- printf("%d %d %d\n", a, b, c);
- enum month d, e, f;
- d = January;
- e = February;
- f = March;
- printf("%d %d %d\n", d, e, f);
4、如果在定义枚举类型时指定元素的值,也可以改变枚举元素的值
例如:
enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat}day;
这时,sun 为 7,mon 为 1,以后元素顺次加 1,所以 sat 就是 6 了。
5、枚举值可以用来作判断
例如:
if (day==month) {…}
if (day>month) {…}
枚举值的比较规则是:按其在说明时的顺序号比较,如果说明时没有人为指定,则第一个枚举元素的值认作 0。
6、一个整数不能直接赋给一个枚举变量,必须强制进行类型转换才能赋值
- #include
- void main()
- {
- enum weekday {sun,mon,tue,wed,thu,fri,sat} day;
- int k;
- printf("请输入0到6的数:");
- scanf("%d",&k);
- day=(enum weekday)k;
-
- switch(day)
- {
- case sun: printf("sunday\n");break;
- case mon: printf("monday\n");break;
- case tue: printf("tuesday\n");break;
- case wed: printf("wednesday\n");break;
- case thu: printf("thursday\n");break;
- case fri: printf("friday\n");break;
- case sat: printf("satday\n");break;
- default: printf("input error\n");break;
- }
- }
输入0-6中的一个数字,能够输出对应的星期。