C语言-枚举(enum)奇妙的使用、联合体(共用体union)对空间节省的巧妙

目录

1.枚举

        1.枚举的定义

         2.枚举的优点

        1. 增加代码的可读性和可维护性

        2. 和#define定义的标识符比较枚举有类型检查,更加严谨

        3. 防止了命名污染(封装)

        4. 便于调试

         5. 使用方便,一次可以定义多个常量

 2.联合体union(共用体)

        1.联合体的定义

        2.联合体的特点

        3.联合体大小的计算


1.枚举

        1.枚举的定义

enum Color//颜色
{
    RED,
    GREEN,
    BLUE
};

枚举的默认值从第一个枚举常量为0开始,依次递增1,并且枚举常量之间用逗号隔开,最后一个元素不需要操作符为结尾,相似与struct结构体的定义也是有分号作为整个结构体定义完的结尾。

也可以在枚举类型定义时赋值,效果仍然是前一个枚举常量的值+1

         2.枚举的优点

        1. 增加代码的可读性和可维护性
        2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
        3. 防止了命名污染(封装)
        4. 便于调试
        5. 使用方便,一次可以定义多个常量

具体案例:

1. 增加代码的可读性和可维护性

        可读性在于能够代替数字以自己独自起名的英文,来提高代码的可读性,能够知道这段代码是属于谁、什么意思。

        可维护性在于封装这些名称在枚举类型中,不能再次创建以这些名称命名的变量或标识符常量,好比颜色Color,我就让三原色RGB在这个Color中,现实也是如此,RGB就是属于颜色。

        下面是利用枚举类型和加减乘除简单计算器的一起使用,其中许多代码与三子棋、扫雷的非游戏内容代码相似,重点在于枚举类型定义的枚举常量的使用。

//练习枚举常量实现可读性高的计算器
#include <stdio.h>
//这是菜单
void menu()
{
	printf("*************************\n");
	printf("***** 1.ADD   2.SUB *****\n");
	printf("***** 3.MUL   4.DIV *****\n");
	printf("********0.EXIT***********\n");
	printf("*************************\n");
}
//我们要选择的数字,恰好可以利用枚举常量
enum option {
	ADD = 1,
	SUB,
	MUL,
	DIV,
	EXIT = 0
};
//加减乘除的函数实现
double Add(double x, double y)
{
	return x + y;
}
double Sub(double x, double y)
{
	return x - y;
}
double Mul(double x, double y)
{
	return x * y;
}
double Div(double x, double y)
{
	return x / y;
}
//利用回调函数,在多个相似度、亲密度高的函数利用时,回调函数利用一个函数作为中介,传递函数指针,在这个中介函数中调用函数,提高了代码的质量
void ReverseCall(double (*Option)(double,double))
{
	double x = 0;
	double y = 0;
	printf("请输入两个操作数:>");
	scanf("%lf %lf", &x, &y);
	double ret = Option(x, y);
	if (ret == (int)ret)
		printf("%d\n", (int)ret);
	else
		printf("%lf\n", ret);
}

int main()
{
	int input = 0;
	do {
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:    //本身case后面写的是1,2,3,4,分别代表加减乘除,但是数字降低了代码的可读性
			ReverseCall(Add); //要使用的函数功能相似、亲密度高,可以利用回调函数减少冗余代码
			break;                                                          //重复多的代码
		case SUB:
			ReverseCall(Sub);
			break;
		case MUL:
			ReverseCall(Mul);
			break;
		case DIV:
			ReverseCall(Div);
			break;
		default:
			printf("选择错误,请重新选择\n");
		}
	} while (input);
	return 0;
}

2. 和#define定义的标识符比较枚举有类型检查,更加严谨

 由于C++的语法的严格性比C语言的严格性要高,所以使用cpp为后缀的扩展名,会报错。

3. 防止了命名污染(封装)

把名字设置为常量,即枚举常量,不能够再次创建同名字的变量,而且常量不能够改变,特殊的在于这个枚举常量是属于一个枚举类型的,例如RED属于Color。

4. 便于调试

其实代码的执行过程是通过:预处理-》编译-》链接-》可执行文件(.exe),在预处理阶段如果使用了#define定义的标识符常量会直接替换成值调试的时候不便于观察,但是我们的枚举常量是不会替换成值的,相比于#define定义的标识符常量更易于观察

 5. 使用方便,一次可以定义多个常量

 2.联合体union(共用体)

        1.联合体的定义

联合体也是属于自定义结构体类型优点在于成员变量共同站一块内存空间

        2.联合体的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小至少是最大成员的大小(因为联
合至少得有能力保存最大的那个成员)。

        3.联合体大小的计算

由第一个成员的大小来开辟内存空间,其他成员一起用,遇到需要扩大空间时扩大

联合体也是有内存对齐规则的,联合体的总大小是最大对齐数的整数倍

例如:Un1中的c开辟5个字节,c的对齐数是1,成员中最大对齐数int是4,4的正整数倍数可以为8,所以浪费掉3个字节,Un1的大小是8个字节

 注意,联合体类型的变量在解引用访问第一个成员时赋值或者改变,也可能会改变其他成员的值,因为是共处在一块内存空间内,所以联合体变量的使用一般是在变量解引用访问某个成员时使用一次就可以被更改而再次使用或者转到其他成员解引用访问时使用。

  • 32
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值