目录
4、枚举的优点:(为什么已有#define还需要使用枚举类型呢?)
一、枚举(enum)
1、枚举的概念:
枚举enum是英文enumerate的缩写,表示列举。enum是C语言中的一个关键字,enum叫枚举数据类型,其可以描述一组整型值的集合,枚举型是预处理指令#define的替代,枚举和宏非常类似,宏在预处理阶段将变量名替换为相应的值,枚举在编译阶段将变量名替换为相应的值。
简单来说:枚举顾名思义就是列举,将某一事物的取值一一列举就是枚举,像星期,性别,月份等有可穷举的事物类型我们就可以将其定义为枚举类型方便程序的编译和程序员的使用。
2、枚举的定义:
定义形式:enum ValueType { ValueName1, ValueName2, ValueName3 , ... } ;
enum + 变量名 { 枚举类型值名 } ; 注意:最后一个枚举常量名后没有逗号
定义使用范例:(这里以枚举一周七个星期为例)
enum week
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
//枚举会将内部枚举常量按次序从0到n依次赋值
//所以如果输出该枚举类型的枚举常量我们可以发现Mon到Sun的值分别为0, 1, 2, 3, 4, 5, 6
//不过这些值也是可以人为改变的,即对枚举常量重赋值
3、枚举的使用:
enum SEX
{
MALE,
FEMALE = -5,
SECRET
};
//这里本应该赋值为0,1,2但是由于我们将'FEMALE'的值定义为了-5
//所以现在的赋值情况为0,-5,-4
//除了人为赋值的常量前后都还是保持递增的规律
#include<stdio.h>
int main()
{
enum SEX s = FEMALE; //enum SEX <-> int,这样理解有助于记忆
printf("%d\n", s);
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
4、枚举的优点:(为什么已有#define还需要使用枚举类型呢?)
- 增加代码的可读性和可维护性
- 和#define定义的标识符比较枚举有类型检查,更加严谨。
- 防止了命名污染(封装)
- 便于调试
- 使用方便,一次可以定义多个常量
二、联合(union)
1、联合的概念:
联合union又称公用体,是一种特殊的自定义类型。
这种类型定义的变量包括一系列成员,特征是这些成员共用同一块空间。
(所以联合体也叫共用体)
2、联合的定义,大小及特征:
定义形式:union TypeName { type name1; type name2; type name3; ... } ;
定义实例:
union UN
{
char c;
int i;
double D;
short s[7];
};
枚举类型大小的计算:联合内最大常量值向大对齐到最大常量类型大小的整数倍。
例如:
Q:计算上方这一联合的大小
A:最大常量值为最后的short类型的数组,大小为7*2=14个字节,最大常量类型为double,大小为8个字节,而14不是8的数倍,所以14向大对齐到8的整数倍16个字节,得16字节为该联合的大小
联合的特征:内部联合常量共用同一块内存空间。
这里我们使用代码验证一下:
#include<stdio.h>
union UN
{
char c;
int i;
double D;
short s[7];
};
int main()
{
union UN un;
printf("%d\n", &un);
printf("%d\n", &(un.c));
printf("%d\n", &(un.i));
return 0;
} //依据输出不难发现该联合的地址与联合常量地址相同
//可知他们共用同一块内存空间
3、联合的应用:判断当前计算机的大小端储存方式
#include<stdio.h>
int main()
{
union UN
{
char c;
int i;
}un;
un.i = 1;
//用整型变量存放数字1,那么存放到内存中就是0x 00 00 00 01或者0x 01 00 00 00
//那么我们只需要判断变量c是01还是00即可判断完成大小端
if (un.c == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
接下来我们还可以利用匿名联合(没有名字的联合,只能使用一次)与函数改进代码:
//函数版本
int check_sys()
{
union //这里的联合只使用一次,为了方便我们使用匿名联合即可
{
char c;
int i;
}un;
un.i = 1; //同样的定i读c
return un.c;
}
#include<stdio.h>
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
————END————