⾃定义类型:联合和枚举

目录

1.枚举类型

1.1 枚举类型的优点

1 .2 枚举类型的使⽤

 2. 联合体

2.1 联合体类型的声明 

2.2 联合体的特点

 ​编辑2.4 联合体⼤⼩的计算

2.5 联合的⼀个练习


1.枚举类型

枚举顾名思义就是⼀⼀列举

int main()
{
    enum day//枚举的创建
    {
        monday,
        tuesday,
        wedday,
        thurday,
        friday,
        satday,
        sunday,
    };

    return 0;
}

这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值

1.1 枚举类型的优点

我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举?

枚举的优点:

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

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

3. 便于调试,预处理阶段会删除 #define 定义的符号

4. 使⽤⽅便,⼀次可以定义多个常量

5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤

1 .2 枚举类型的使⽤

int main()
{
	enum color
	{
		red=1,
		green=4,

	};

	return 0;
}

使用枚举写出计算器。

#include<stdio.h>
void ADD()
{
	int a = 0;
	int b = 0;
	printf("输入两个操作数\n");
	scanf("%d %d", &a, &b);
	int c = a + b;
	printf("%d\n", c);
 }
void SBU()
{
	int a = 0;
	int b = 0;
	printf("输入两个操作数\n");
	scanf("%d %d", &a, &b);
	int c = a - b;
	printf("%d\n", c);
}
void MUL()
{
	int a = 0;
	int b = 0;
	
	printf("输入两个操作数\n");
	scanf("%d %d", &a, &b);
	int c = a * b;
	printf("%d\n", c);
}void DIV()
{
	int a = 0;
	int b = 0;
	printf("输入两个操作数\n");
	scanf("%d %d", &a, &b);
	int c = a / b;
	printf("%d\n", c);
}
enum option 
{
	Exit,
	Add,
	Sub,
	Mul,
	Div,
};
void menu()
{
	printf("***********************\n");
	printf("*** 1.sum    2.sub  ***\n");
	printf("*** 3.mul    4div   ***\n");
	printf("*** 0.exit          ***\n");
	printf("***********************\n");

 }
int  main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
			scanf("%d", &input);
			switch (input)
			{
			//case 1://之前我们这里都是 数字这里也可以改成枚举
			case Add:
				ADD();
				break;
			//case 2: 
			case Sub:
				SBU();
				break;
			//case 3:
			case Mul:
				MUL();
				break;
			//case 4:
			case Div:
				DIV();
				break;
			case 0:
				printf("退出计算器\n");
				break;
			default:
				printf("输入错误,请重新输入\n");
				break;
			}

	} while (input);
	return  0;
}

 2. 联合体

2.1 联合体类型的声明 

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。 但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所 以联合体也叫:共⽤体。

给联合体其中⼀个成员赋值,其他成员的值也跟着变化。

联合体的关键字:union

大家可以思考一下面的代码是什么?

#include <stdio.h>
struct st
{

	char i;
	int c;
};
union un
{
	char i;
	int c;

};
int main()
{
	printf("%zd\n", sizeof(struct st));
	printf("%zd\n", sizeof(union  un));

	return 0;
}

第一个结构体内存对齐 我们上节课中讲的很详细,今天大家都会了吧。

 但是第二个联合体 为什么会是4 呢?

我们下面仔细来拆分

下面可以观察这个代码

int main()
{/*
    printf("%zd\n", sizeof(struct st));
    printf("%zd\n", sizeof(union  un));*/
    union un un = { 0 };
    printf("%p\n", &(un));
    printf("%p\n", &(un.c));
    printf("%p\n", &(un.i));

    return 0;
}

2.2 联合体的特点

#incldue<stdio.h>
union Un
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义
	union Un un = { 0 };
	un.i = 0x11223344;
	un.c = 0x55;
	printf("%x\n", un.i);
	return 0;
}

 2.4 联合体⼤⼩的计算

联合的⼤⼩⾄少是最⼤成员的⼤⼩。

• 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。 

#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));
 printf("%d\n", sizeof(union Un2));
 return 0;
}

 联合体的大小是他成员最大的大小 ?对or 错  

答案是  error 

2.5 联合的⼀个练习

写⼀个程序,判断当前机器是⼤端?还是⼩端?

我们以前学习大端字节和小端字节的时候,我们我们写这个,应该会有很多同学的都忘记了吧,没关系,我们下面给大家来复习一下。

#incldue <stdio.h>
int main()
{
	int  a = 1;
	if ((*(char*)&a) == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

 下面我们用联合体写一个,很简单,方便理解。

#incldue <stdio.h>
union un
{
	char i;
	int c;

};
int main()
{
	union un un = { 0 };
	un.c = 1;//假设第一个字节是1
	if (un.i == 1)//判断第一位是1 还是0
		printf("小端\n");
	else
		printf("大端\n ");

	return 0;
}

完结 下班

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值