枚举
-
请声明一个变量保存一个人的性别 ,一个人的学历,一个方向,这样用 char 类型是不是不能全部给保存下,性别有男女两个值,但是你定义一个也只能保存一个值
-
某些变量的取值是限定的,变量的取值只能是指定的几个值当中的任意一个,除此之外的不行
-
C语言没有提供那么我就自己定义一个限定取值的类型,枚举就可以
-
作用:支持程程序员新创建一个类型,限定取值,比如使用结构体创建一个新的类型,置顶这个类型的变量只能存储东南西北中的任意一个,除此之外的不行
-
如何使用枚举创建一个新的类型,来达到限定的取值
-
语法格式:
// 定义枚举类型的语法格式 /* enum 新数据类型的名称 { 取值 1, 取值 2, 取值 3, 取值 4 } */ enum fangxiang{ east, west, south, north }
-
表示创建了一个数据类型,这个数据类型的名称叫做 enum fangxiang,可以声明这个类型的变量,这个变量中就只能存储这其中指定的任意一个
-
声明一个枚举类型的变量
enum fangxiang dir ;
- 枚举变量的初始化
enum fangxiang dir = east; // 这不是字符串,存储的是 printf("dir = %d\n",dir);
-
枚举的注意事项
-
枚举的作用域
-
如果将枚举类型定义在函数内部,那么这个类型就只能在函数内部使用,定义在函数外部才可以给所有的函数使用
-
枚举项,都偶有一个对应的整形的数,默认从 0 开始依次递增
-
有多大?无论是什么类型的枚举变量都是占据 4 个字节
-
存储的是什么?枚举变量当中真正存储的是整形的变量,所以才可以使用%d 打印出来
-
如果你就要打印枚举值的话,写判读是 0 打印第一值,1 打印第二值
-
既然存储的是一个整形的数,那么我们也可以存储大于枚举项的整数值,但是我们并不会这样做,这样可读性高
-
默认情况下,每一个枚举值对应的整形的数从 0 开始依次递增,但是我们也可以指定整形的数
enum xueli{ xiaoxue = 10, chuzhong = 20, gaozhong = 30, daxue = 4 };
-
使用规范
- 枚举类型的名称命名规范:首字母大写,每一个单词的首字母大写
- 枚举值的命名规范:枚举值的名称都以枚举类型开头,这样的好处在于不用每次都要去查看之前定义的这个枚举类型,
enum Gender{
GenderMan,
GenderWomen
};
enum Gender xiaoMing = GenderMan;
typedef
- typedef 类型定义
- 作用:为一个已经存在的数据类型取一个别名,如果我们想要使用这个类型,直接使用这个别名就可以了
- 语法格式:
- typedef 已经存在的数据类型 别名
typedef int intNew;
intNew a = 10;
printf("a = %i\n",a); // 这个时候 intNew 完全等价于 int
- 什么时候为已经存在的数据类型取一个别名?
- 当数据类型很长的时候就可以为这个数据类型取一个短一点的别名
unsigned long long int num = 10;
typedef unsigned long long int ulli;
ulli num1 = 10; // 简化数据类型的名称i哦
- 为结构体取一个别名
- 第一种方式,先声明结构体类型,然后再使用 typedef 为这个结构体类型取一个别名
- 第二种方式,直接在定义结构体的时候取别名
// 定义完结构体再取别名
struct Student{
char *name;
int age;
int score;
};
typedef struct Student Student;
Student s1 = {"小明",18,100};// 直接使用别名就可以了
// 直接在定义结构体类型的时候就取个别名
typedef struct Birth{
int year;
int month;
int day;
} Birth;
Birth xiaoLan = {2020,8,4};
- 第三种声明一个匿名,(最常用的)
typedef struct {
int height;
int weight;
} tiJi;
tiJi picture = {2,4};
- 为枚举类取一个短别名
enum fangXiang{
fangXiangEast,
fangXiangWest,
fangXiangSort,
fangXiangNorth
};
typedef enum fangXiang fangXiang;
fangXiang f1 = fangXiangEast;
// 第二种
typedef enum Gender{
GenderMan,
GenderWomen
} Gender;
Gender g1 = GenderMan;
// 第三种
typedef enum{
xiaoxue,
gaozhong,
daxue
} xueLi;
xueLi x1 = xiaoxue;