c语言自定义类型枚举,联合(枚举的巧妙使用,联合体大小的计算)
Posted Ischanged
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言自定义类型枚举,联合(枚举的巧妙使用,联合体大小的计算)相关的知识,希望对你有一定的参考价值。
坚持到最后的那一刻就会看到胜利的曙光。
枚举
枚举顾名思义就是一一列举。 把可能的取值一一列举。 比如我们现实生活中: 一周的星期一到星期日是有限的7天,可以一一列举。性别有:男、女、保密,也可以一一列举。 月份有12个月,也可以一一列举 这里就可以使用枚举了
枚举类型的定义
如何定义枚举类型呢?
其实枚举类型和结构体很相似,我们可以对比着来记忆,**对于枚举花括号里面的值是枚举的可能取值,创建枚举变量时变量的值是其中的可能值,但如果创建了结构体变量,花括号里面的成员都属于结构体变量的内容,**我们要注意区分,枚举类型的定义如下
enum tag
member - list;
ariable - list;
枚举标签:tag
枚举类型:eum tag
枚举的可能取值:member_list
枚举的变量列表:variable_list**
枚举类型定义的例子:
enum Day//星期
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
sun
;
enum sex//性别
MALE,
FEMALE,
SECRET
;
enum color//颜色--三原色 rgb
RED,
GREEN,
BLUE
;
以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。 中的内容是枚举类型的可能取值,也叫 枚举常量 。为什么叫枚举常量呢?因为这些可能取值能表达一些常量数值,数值的类型为int 类型。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在定义的时候也可以赋初值。(常量也可以赋初值,没有改变常量的值) 例如:
enum Color
RED ,
GREEN ,
BLUE
;
#include<stdio.h>
int main()
printf("%d\\n", RED);
printf("%d\\n", GREEN);
printf("%d\\n", BLUE);
//打印结果0,1,2
return 0;
通过对枚举成员赋初值,改变枚举常量的默认大小,打印结果为0,2,3
#include<stdio.h>
enum Color
RED ,//0
GREEN = 2,//2
BLUE//3
;
int main()
enum Color c = BLUE;
//enum Color c = 8;
printf("%d\\n", sizeof(c));
return 0;
接下来我们在看下面的代码,我们通过enum
Color类型定义了一个枚举变量c,变量的取值为枚举类型里面的成员,把BLUE赋值给变量c,c的值也就是3,那可不可以把3直接赋值给c呢?不可以,因为枚举变量的可能取值为枚举类型里面的取值,值的类型为枚举类型,虽然3和枚举常量的值是一样的,但它们属于不同的类型(枚举类型是枚举类型,整形是整形),对于c++编译器,运行如下代码就会报错,(c++编译器检测更严格)对于c的编译器就不会报错
#include<stdio.h>
enum Color
RED ,//0
GREEN = 2,//2
BLUE//3
;
int main()
//CPP 语法检查更加严格
//enum Color c = BLUE;
enum Color c = 3;
printf("%d\\n", sizeof(c));
return 0;
枚举的优点
为什么使用枚举?我们可以使用 #define 定义常量,为什么非要使用枚举? 枚举的优点:
- 增加代码的可读性和可维护性
- 和#define定义的标识符比较枚举有类型检查,更加严谨。(#define 定义的宏只是简单的符号替换没有什么类型,而枚举是一种类型,在数据的赋值的时候有类型的检查)
- 防止了命名污染(#define 定义的宏是一种全局变量,枚举常量是定义在枚举类型里面的)
- 便于调试(#define 定义的宏在调试之前已经完成替换了,后面调试不好看)
- 使用方便,一次可以定义多个常量
如下代码,假设我们要实现一个简单的计算器,我们从键盘上面输入数字0,1,2,3,4分别运行执行退出,加减乘除
通过switch语句分别实现相应的功能,case语句后面的数字只有单一的意思,如果不看代码及解释,不是很快地读懂代码,如果通过枚举的定义,ADD不仅表示执行加法,也表示语句后面有加法函数,这样可以使代码的可读性,和维护性提高了,
// 0. exit 1. add 2. sub
// 3. mul 4. div
enum Option
EXIT,//0
ADD,//1
SUB,//2
MUL,//3
DIV//4
;
#include<stdio.h>
int main()
int input = 0;
do
printf("请选择:>");
scanf("%d", &input);
switch (input)
case 1://ADD
break;
case 2://SUB
break;
case 3://MUL
break;
case4://DIV
break;
case 0://EXIT
break;
default:
break;
while (input);
return 0;
枚举的使用
简单简单计算器的实现
#include<stdio.h>
enum option//定义枚举类型option
EXIT,//0
ADD,//1
SUB,//2
MUL,//3
DIV//4
;
void menu()
printf("******************************************\\n");
printf("****** 1. add 2.sub *****\\n");
printf("****** 2.mul 4.div *****\\n");
printf("****** 0.exit *****\\n");
printf("******************************************\\n");
int add(int x, int y)//加法
return x + y;
int sub(int x, int y)//减法
return x - y;
int mul(int x, int y)//乘法
return x * y;
int div(int x, int y)//除法
return x / y;
int main()
enum option input = EXIT;
int x = 0;
int y = 0;
do
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
case ADD:
printf("请输入两个操作数:>");
scanf("%d %d", &x, &y);
printf("%d\\n", add(x, y));
break;
case SUB:
printf("请输入两个操作数:>");
scanf("%d %d", &x, &y);
printf("%d\\n", sub(x, y));
break;
case MUL:
printf("请输入两个操作数:>");
scanf("%d %d", &x, &y);
printf("%d\\n", mul(x, y));
break;
case DIV:
printf("请输入两个操作数:>");
scanf("%d %d", &x, &y);
printf("%d\\n", div(x, y));
break;
case EXIT:
printf("退出计算机\\n");
break;
default:
printf("输入错误,请重新输入\\n");
break;
while (input);
return 0;
联合(共用体)
联合体类型的定义
联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块 空间(所以联合也叫共用体)。 比如:
//联合类型的声明
union Un
char c;
int i;
;
//联合变量的定义
union Un un;
//计算连个变量的大小
printf("%d\\n", sizeof(un));
联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。
#include<stdio.h>
union Un
int i;
char c;
;
int main()
union Un un;
// 下面输出的结果是一样的吗?
printf("%d\\n", &(un.i));
printf("%d\\n", &(un.c));
//下面输出的结果是什么?
return 0;
从上面代码的执行结果可以看出,**在创建联合体成员变量的时候,他们都是从同一起始位置开始创建,开辟空间的,**所以联合体成员变量的内存空间是有所重叠,覆盖的,因此计算联合体大小的时候有所不同。
联合大小的计算
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
如我们计算如下代码:
#include<stdio.h>
union Un1
char c[5];
int i;
;
union Un2
short c[7];
int i;
;
int main()
printf("%d\\n", sizeof(union Un1));//8
printf("%d\\n", sizeof(union Un2));//16
return 0;
图示理解:
以上是关于c语言自定义类型枚举,联合(枚举的巧妙使用,联合体大小的计算)的主要内容,如果未能解决你的问题,请参考以下文章