目录
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;
}
完结 下班