背景:

  阅读新闻

  [日期:2019-08-02]

  来源:Linux社区

  作者:lanhaicode

  [字体:大 中 小]

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

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

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

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

  C语言枚举类型enum详解_C语言枚举类型enum详解

  当枚举类型和枚举变量放在一起定义时,枚举类型的名字(就是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);

  运行结果:

  C语言枚举类型enum详解_C语言枚举类型enum详解_02

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

  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);

  运行结果:

  C语言枚举类型enum详解_C语言枚举类型enum详解_03

  对上面的代码稍加修改

  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);

  运行结果:

  C语言枚举类型enum详解_C语言枚举类型enum详解_04

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

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

  num =(enum week)10;

  printf("%d", num);

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

  运行结果:

  C语言枚举类型enum详解_C语言枚举类型enum详解_05

  总结:

  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 week),可以改为(my),两者效果是一样的

  补充:对上面总结的第五点:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的枚举成员(枚举常量),进行验证

  enum m1{m1, m2};

  enum m2{m3, m4};

  enum m1{m5, m6};

  上述代码定义的枚举类型enum m1多次定义,是不允许的,编译器会报错C语言枚举类型enum详解_C语言枚举类型enum详解_06还有一种特殊情况,即使定义了同名的枚举类型,编译器也不会报错

  enum m1{m1, m2};

  enum m2{m3, m4};

  enum m1;

  上面的代码中,第二个enum m1没有定义枚举成员,在编译阶段是不会报错的(估计是编译器并不认为定义了枚举成员的enum m1 和 没有定义枚举成员的enum m1是同名的枚举类型)

  C语言枚举类型enum详解_C语言枚举类型enum详解_07

  enum的赋值范围

  这个也是无意间注意到的,文章在开头提到枚举类型描述的是一组整型值的集合,枚举类型的占的字节数是4个字节,所以我们可以用INT_MAX和INT_MIN来测试枚举类型的赋值范围,赋值的最大值应该是INT_MAX(也就是2147483647),下面用代码来测试一下

  enum test{m1=INT_MAX};

  printf("%d

  %d

  ", m1, INT_MAX);

  运行结果:

  C语言枚举类型enum详解_C语言枚举类型enum详解_08

  上面的代码没有问题,下面来测试一下越界的赋值

  enum test{m1=INT_MAX+1};

  printf("%d

  %d

  ", m1, INT_MAX);

  编译器在编译阶段会有警告C语言枚举类型enum详解_C语言枚举类型enum详解_09,测试了枚举类型的最大值,下面来测试下枚举类型的最小值

  enum test{m1=INT_MIN};

  printf("%d

  %d

  ", m1, INT_MIN);

  运行结果:

  C语言枚举类型enum详解_C语言枚举类型enum详解_10

  上面的代码没有问题,下面来测试一下越界的赋值

  enum test{m1=INT_MIN-1};

  printf("%d

  %d

  ", m1, INT_MIN);

  和上面相同,编译器也会有警告C语言枚举类型enum详解_C语言枚举类型enum详解_11

  上面这句话很容易让读者以为enum类型和int类型是等价的,好像可以把int型的数据直接赋值给enum变量,实际上是不行的,需要进行强制类型转换,C语言提供了一种称为“枚举”的类型,其中一个枚举常量的占的字节数为4个字节,恰好和int类型的变量占的字节数相同,假设把这些枚举常量说明为整型,字符型或其他类型显然是不妥当的,因为枚举类型是一种基本数据类型,而不是一种构造类型,它不能再分解为什么基本类型。

  Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

  本文永久更新链接地址:https://www.linuxidc.com/Linux/2019-08/159760.htm

  C语言枚举类型enum详解_C语言枚举类型enum详解_12

  C语言 setlocale()函数详解

  C语言 extern的使用详解(多文件编程)

  相关资讯

  C语言枚举类型 C语言 enum

  本文评论

  查看全部评论 (0)

  表情: C语言枚举类型enum详解_C语言枚举类型enum详解_13

  姓名:

  匿名

  字数

  同意评论声明

  评论声明

  尊重网上道德,遵守中华人民共和国的各项有关法律法规

  承担一切因您的行为而直接或间接导致的民事或刑事法律责任

  本站管理人员有权保留或删除其管辖留言中的任意内容

  本站有权在网站内转载或引用您的评论

  参与本评论即表明您已经阅读并接受上述条款

  最新资讯

  C语言 extern的使用详解(多文件编程)

  C语言枚举类型enum详解

  C语言 setlocale()函数详解

  Linux Mint 19.2 “Tina” 正式发布,看看

  如何将HTTPS和WWW带回Google Chrome地址栏

  LLVM计划在10月份完成从SVN到Git的转换

  AMD发布有关RDNA 1.0 ISA的文档

  C语言编码方式之ASCII、ANSI、Unicode

  逆波兰表达式 - 中缀表达式转后缀表达式

  Electron 6.0 发布,改进的Promise与原生