C语言枚举类型enum详解、枚举变量。枚举函数

枚举定义

关键字:enum
用途:定义一个取值受限制的整型变量,用于限制变量取值范围;宏定义的集合
定义枚举变量:
enum{FALSE = 0, TRUE = 1} EnumName;
因为枚举变量类型较长,所以通常用typedef更改变量类型名
引用枚举成员:
EnumName = FALSE;
EnumName = TRUE;

枚举应用

原文链接:https://blog.csdn.net/yetaodiao/article/details/127372017

enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值,

我们可以将枚举理解为编译阶段的宏,使用格式:

enum typeName{
    
     valueName1, valueName2, valueName3, ...... };

是枚举类型的名字,花括号里面的元素(枚举成员)是常量而不是变量,这个一定要搞清楚,因为枚举成员的是常量,所以不能对它们赋值,只能将它们的值赋给其他的变量

当枚举类型和枚举变量放在一起定义时,枚举类型的名字(就是enum week中的week)可以省略不写,意思是上图的有两种写法
  第一种:

enum week{
    
    Mon=1, Tues, Wed, Thurs}num;

第二种:

enum {
    
    Mon=1, Tues, Wed, Thurs}num;

这一点其实和结构体中的无名结构很相似,虽然定义枚举类型变量和定义结构类型变量看起来很相似,但是两者的区别还是蛮大的,一个结构体类型变量里面包含若干个成员,相当于一个打包好的快递盒子,

而枚举类型变量就不一样了,枚举类型变量不是一个包含若干个成员的集合,枚举类型变量和int、char类型的变量其实差不多,只不过枚举类型变量的赋值只能用自身的枚举成员来赋值,以上面的例子来说,

num的赋值就只能用枚举成员Mon、Tues、Wed、Thurs,而不能用其他枚举类型的枚举成员来赋值

定义枚举变量和定义结构体变量相同,有两种定义方法

第一种:(定义枚举类型的同时定义枚举变量)

enum week{
    
    Mon=1, Tues, Wed, Thurs}num;

第二种:(先定义枚举类型,再定义枚举变量)

enum week{
    
    Mon=1, Tues, Wed, Thurs};
  enum week num;

下面将用不同的示例来说明枚举类型的特点

示例一:(不显式说明枚举常量的值)

enum week{Mon, Tues, Wed, Thurs, Fri, Sat, Sun};

在没有显示说明的情况下,枚举常量(也就是花括号中的常量名)默认第一个枚举常量的值为0,往后每个枚举常量依次递增1,所以Mon=0,Tues=1,・・・・Sun=6,下面来验证一下

enum week{
    
    Mon, Tues, Wed, Thurs, Fri, Sat, Sun};

  printf("Mon=%d

  Tues=%d

  Wed=%d

  Thurs=%d

  Fri=%d

  Sat=%d

  Sun=%d

  ", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);

运行结果:
  在这里插入图片描述

————————————————
版权声明:本文为CSDN博主「叶涛网站推广优化」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

示例二:(显示说明部分枚举常量的值)

enum week{
    
    Mon=1, Tues, Wed, Thurs, Fri, Sat, Sun};

上面的代码中,只显式说明了枚举常量Mon的值为1,未指定的枚举名的值将依着最后一个指定值向后依次递增(注意是最后一个指定值)

enum week{
    
    Mon=1, Tues, Wed, Thurs, Fri, Sat, Sun};

  printf("Mon=%d

  Tues=%d

  Wed=%d

  Thurs=%d

  Fri=%d

  Sat=%d

  Sun=%d

  ", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);

运行结果:

在这里插入图片描述

对上面的代码稍加修改

enum week{
    
    Mon=1, Tues, Wed, Thurs, Fri=10, Sat, Sun};
  printf("Mon=%d

  Tues=%d

  Wed=%d

  Thurs=%d

  Fri=%d

  Sat=%d

  Sun=%d
  ", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);

运行结果:
在这里插入图片描述

示例三:(对枚举变量进行赋值)

enum week{Mon=1, Tues, Wed, Thurs}num;

num =(enum week)10;

printf(“%d”, num);

一个整数不能给一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换后才能赋值,上面的代码中,在对枚举变量赋值10的时候进行的强制类型转换,将整型常量10转换成了enum week类型再赋值给num变量,

运行结果:

在这里插入图片描述

总结:

1、在没有显示说明的情况下,枚举常量(也就是花括号中的常量名)默认第一个枚举常量的值为0,往后每个枚举常量依次递增1

2、在部分显示说明的情况下,未指定的枚举名的值将依着之前最有一个指定值向后依次递增

3、一个整数不能给一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换后才能赋值

4、同一枚举类型中不同的枚举成员可以具有相同的值

5、同一个程序中不能定义同名的枚类型,不同的枚举类型中也不能存在同名的枚举成员(枚举常量)

typedef enum week my;

或者

typedef enum week{Mon=1, Tues, Wed, Thurs}my;

上面typedef也可以省略week

typedef enum{Mon=1, Tues, Wed, Thurs}my;

上面两种形式中,my都是enum week的别名(意思是my和enum week等价),需要注意的是如果将第二句的typedef去掉那么my就变成了enum week类型的变量,如果加上typedef那么my就是enum的别名,这点要注意区分

在定义了enum week的别名my后,后面就可以使用my来定义枚举类型变量

my num;

num =(enum week)10;

printf(“%d”, num);

枚举函数

enum eMovePriorityLevel {
    
    

eMovePriorityLevel_cant_move_unknown,

eMovePriorityLevel_cant_move_by_win, ///< 不能移动-已经胜利

eMovePriorityLevel_wall, ///< 不能移动-遇到了墙

eMovePriorityLevel_cant_move_by_go_twice, ///< 不能移动-已经走了2次

eMovePriorityLevel_can_move_by_go_once, ///< 可以移动-已经走了一次

eMovePriorityLevel_can_move_by_door, ///< 可以移动-是门, 从来没走过

};

使用枚举值类型的函数定义

enum eMovePriorityLevel GetMovePriorityLevel(char cPos)

使用枚举值类型的函数实现

enum eMovePriorityLevel GetMovePriorityLevel(char cPos)

{
    
    

enum eMovePriorityLevel Level;

switch (cPos)

{
    
    

case CHAR_WALL:

Level = eMovePriorityLevel_wall;

break;

case CHAR_DOOR:

Level = eMovePriorityLevel_can_move_by_door;

break;

case CHAR_EXIT:

Level = eMovePriorityLevel_cant_

枚举函数2

enum ICMDeviceType枚举类型的名字,
Icmdevtype 枚举变量
Get_SensorType()枚举函数

1enum ICMDeviceType Icmdevtype = NOS;
2enum ICMDeviceType
{
    
    
     NOS=0, ICM20602, ICM42688, Adis16470,adis16800//枚举成员
};

3enum ICMDeviceType Get_SensorType()
{
    
    
    uint8_t whoami=0;
    read_1B( MPUREG_WHO_AM_I, &whoami );//读取ID,IIC,指针,形参地址
    if( whoami == 0x12 )
    {
    
    
        Icmdevtype = ICM20602;
    }
    enum ICMDeviceType Query_SensorType()
{
    
    
    return Icmdevtype;
}

猜你喜欢

转载自blog.csdn.net/weixin_44057803/article/details/132595743
今日推荐