当前位置:网站首页>c语言自定义类型枚举,联合(枚举的巧妙使用,联合体大小的计算)
c语言自定义类型枚举,联合(枚举的巧妙使用,联合体大小的计算)
2022-07-02 06:28:00 【Ischanged】
坚持到最后的那一刻就会看到胜利的曙光。
枚举
枚举顾名思义就是一一列举。 把可能的取值一一列举。 比如我们现实生活中: 一周的星期一到星期日是有限的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;
}
图示理解:
边栏推荐
- Get the width and height of the screen in real time (adaptive)
- STL速查手册
- Summary of one question per day: linked list (continuously updated)
- 我的vim配置文件
- 樂理基礎(簡述)
- Carsim-问题Failed to start Solver: PATH_ID_OBJ(X) was set to Y; no corresponding value of XXXXX?
- Find and rfind methods in string
- The source code of the live app. When the verification method is mailbox verification, the verification code is automatically sent to the entered mailbox
- Backup, recovery and repair of XFS file system
- My VIM profile
猜你喜欢
顺序表基本功能函数的实现
MySQL优化
Development of digital collection trading website development of metauniverse digital collection
Dynamic extensible representation for category incremental learning -- der
Animation synchronization of CarSim real-time simulation
It's great to save 10000 pictures of girls
Comparable,Comparator,Clonable 接口使用剖析
OpenCV 6.4 中值滤波器的使用
Target detection for long tail distribution -- balanced group softmax
How to build the alliance chain? How much is the development of the alliance chain
随机推荐
Find and rfind methods in string
In depth understanding of prototype drawings
High school mathematics compulsory one
Array and string processing, common status codes, differences between PHP and JS (JS)
Using super ball embedding to enhance confrontation training
旋转链表(图解说明)
CarSim problem failed to start solver: path_ ID_ OBJ(X) was set to Y; no corresponding value of XXXXX?
Use of opencv3 6.2 low pass filter
Carsim-路面3D形状文件参数介绍
Summary of one question per day: stack and queue (continuously updated)
Dynamic extensible representation for category incremental learning -- der
Matlab - autres
Valin cable: BI application promotes enterprise digital transformation
Chinese garbled code under vscade
C语言实现XML生成解析库(XML扩展)
How to wrap qstring strings
樂理基礎(簡述)
Carsim-问题Failed to start Solver: PATH_ID_OBJ(X) was set to Y; no corresponding value of XXXXX?
業務架構圖
Get the width and height of the screen in real time (adaptive)