1 枚举类型

1 . 如果一个变量只有几种可能的值,则可以定义为“枚举类型”;所谓“枚举”就是把可能的值一一的列举出来,变量的值只限于列举出来的值的范围, 如:

语法:

enum 枚举类型{枚举成员列表};

//其中的枚举成员列表是以逗号“,”相分隔如:

enum Spectrum{red,balck,yellow,blue,white};

时间:2018-10-24 修改,Spectrum枚举变量中成员balck写错了,应为black。多谢[福葱]读者的提示!

enum Spectrum{red,balck,yellow,blue,white};

enum Spectrum{red,black,yellow,blue,white};

其中:enum为关键字, Spectrum为该枚举类型的标记名(标记名:遵循标识符的命名规则);

花括号“{}”中的red,black,yellow,blue,white称为“枚举元素”或“枚举常量”;

2.可以用“枚举类型”声明符号名称来表示int型常量。只要是能使用int型的地方就能够使用枚举类型。注意:C语言中的枚举的一些特性不适合C++;比如c中的枚举变量允许使用++运算符,但是c++中则不允许。

3.有关枚举类型常量的默认值

这里仍然拿上面的枚举类型常量作为示例:

enum Spectrum{red,black,yellow,blue,white};

0 1 2 3 4

默认情况下:该枚举列表中的常量值分别为:0,1,2,3,4

当然也可以在枚举声明中,可以为枚举常量指定整数值:如

enum Spectrum{ red=10, black=20, yellow=30,

blue=40, white=50 };

也可以只对枚举类型中的一个枚举元素赋值;这时该枚举元素后面的枚举元素会被赋予后续的值。如:

enum Spectrum{ red, black=22, yellow, blue, white };

则:red=0, black=22, yellow=23, blue=24, white=25;

此外,还可在枚举类型成员列表中,声明多个成员的数值(整型常量值)相同, 如:

enum Spectrum{ red, black=22, yellow, blue = 22, white };

则: red = 0, black = 22, yellow = 23, blue = 22 white = 23.

2018-04-26 07:04:01 补充

4.枚举类型也可以是匿名的

匿名的枚举类型会有着意想不到的作用,比如在程序中需要使用数值的名字的时候,常常有3种方法可以实现。

(1)宏定义

#define FALSE 0#define TRUE 1

但是宏定义有弱点:其定义的只是预处理阶段的名字,在编译器的预处理阶段会进行简单的名字替换,而且不会进行类型的安全检查,其作用域是全局的 href="https://blog.csdn.net/lixiaogang_theanswer/article/details/80140522">( C++11强枚举类型 ) ,因此若程序中有变量true、false,则会被替换。为了避免这样的情况,采用将全部的宏用大写来命名,以区别于正常的代码。

(2)匿名的enum枚举

enum {FALSE,TRUE};//FALSE 0, TRUE 1Text only

这里的FALSE,TRUE都是编译时期的名字,编译器会对其进行类型检查,若代码中其他地方有和该名字冲突的,会报错。因此采用匿名的枚举不会有产生干扰正常代码的尴尬。

(3)采用静态变量

C++中更加推荐使用该方式,如:

static const int FALSE = 0;

static const int TRUE = 1;

在这里的TRUE,FALSE同样会得到编译器在编译阶段的检查。由于是静态变量,因此其作用域被限制到了本文件内。相比于enum枚举类型,静态变量不仅是编译时期的名字,同时编译器还可能会在代码中为TRUE,FALSE产生实际的数据,这会增加一点存储空间。

5.枚举类型的作用:提高程序的可读性和可维护性

示例代码一:输出12个月的英文单词

#include#include enum Months{jan=1,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec};

int main(void)

{

enum Months m;

//flag用来标记输出的个数,若为4个,则输出一个换行符 int flag=0;

//指针数组,存放的是个字符串的入口地址 char *months[]={"January","February","March","April","May","June",

"July","August","September","October","November","December"};

for (m=jan;m<=dec;m++)

{

printf ("%-d月份:%-10s ",m,months[m-1]);

flag++;

if (flag%4==0)

{

putchar('\n');

}

}

system ("pause");

return 0;

}

示例代码二:用作函数返回错误码

这是在编程中使用得最为广泛的用法之一,通常在开发中,我们把考虑到的所有可能出现的错误都列举在一个enum中,这样,我们就不用再函数调用出错时候,返回一个数字。这样的做法好处有很多:如更容易看出函数调用出错的原因、如果enum中有漏掉的错误提示,则再添加一个等。

typedef enum {

/* Internal errors to rdkafka: */

RD_KAFKA_RESP_ERR__BEGIN = -200, /* begin internal error codes */

RD_KAFKA_RESP_ERR__BAD_MSG = -199, /* Received message is incorrect */

RD_KAFKA_RESP_ERR__BAD_COMPRESSION = -198, /* Bad/unknown compression */

RD_KAFKA_RESP_ERR__DESTROY = -197, /* Broker is going away */

RD_KAFKA_RESP_ERR__FAIL = -196, /* Generic failure */

RD_KAFKA_RESP_ERR__TRANSPORT = -195, /* Broker transport error */

RD_KAFKA_RESP_ERR__CRIT_SYS_RESOURCE = -194, /* Critical system resource* failure */

RD_KAFKA_RESP_ERR__RESOLVE = -193, /* Failed to resolve broker */

RD_KAFKA_RESP_ERR__MSG_TIMED_OUT = -192, /* Produced message timed out*/

RD_KAFKA_RESP_ERR__PARTITION_EOF = -191, /* Reached the end of the* topic+partition queue on* the broker.* Not really an error. */

RD_KAFKA_RESP_ERR__UNKNOWN_PARTITION = -190, /* Permanent:* Partition does not* exist in cluster. */

RD_KAFKA_RESP_ERR__FS = -189, /* File or filesystem error */

RD_KAFKA_RESP_ERR__UNKNOWN_TOPIC = -188, /* Permanent:* Topic does not exist* in cluster. */

RD_KAFKA_RESP_ERR__ALL_BROKERS_DOWN = -187, /* All broker connections* are down. */

RD_KAFKA_RESP_ERR__INVALID_ARG = -186, /* Invalid argument, or* invalid configuration */

RD_KAFKA_RESP_ERR__TIMED_OUT = -185, /* Operation timed out */

RD_KAFKA_RESP_ERR__QUEUE_FULL = -184, /* Queue is full */

RD_KAFKA_RESP_ERR__ISR_INSUFF = -183, /* ISR count < required.acks */

RD_KAFKA_RESP_ERR__END = -100, /* end internal error codes */

/* Standard Kafka errors: */

RD_KAFKA_RESP_ERR_UNKNOWN = -1,

RD_KAFKA_RESP_ERR_NO_ERROR = 0,

RD_KAFKA_RESP_ERR_OFFSET_OUT_OF_RANGE = 1,

RD_KAFKA_RESP_ERR_INVALID_MSG = 2,

RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART = 3,

RD_KAFKA_RESP_ERR_INVALID_MSG_SIZE = 4,

RD_KAFKA_RESP_ERR_LEADER_NOT_AVAILABLE = 5,

RD_KAFKA_RESP_ERR_NOT_LEADER_FOR_PARTITION = 6,

RD_KAFKA_RESP_ERR_REQUEST_TIMED_OUT = 7,

RD_KAFKA_RESP_ERR_BROKER_NOT_AVAILABLE = 8,

RD_KAFKA_RESP_ERR_REPLICA_NOT_AVAILABLE = 9,

RD_KAFKA_RESP_ERR_MSG_SIZE_TOO_LARGE = 10,

RD_KAFKA_RESP_ERR_STALE_CTRL_EPOCH = 11,

RD_KAFKA_RESP_ERR_OFFSET_METADATA_TOO_LARGE = 12

} rd_kafka_resp_err_t;

上面的代码是 kafka C客户端中的源码,即列举出kafka 客户端中可能会出现的错误的原因。通常,还会实现2个函数,如:

//1.返回便于人们阅读的错误字符串const char *rd_kafka_err2str (rd_kafka_resp_err_t err);

//该函数的实现很简单,即以字符串形式打印error,如:const char *rd_kafka_err2str (rd_kafka_resp_err_t err)

{

char *tempStr = NULL;

//对err的判断 switch(err)

{

case RD_KAFKA_RESP_ERR__BEGIN : tempStr = "RD_KAFKA_RESP_ERR__BEGIN";break;

//或: case RD_KAFKA_RESP_ERR__BEGIN: return "RD_KAFKA_RESP_ERR__BEGIN"; //此处省略..... }

}

//2.若errnox错误码在我们列举出的enum中,则返回enum中的错误码打印rd_kafka_resp_err_t rd_kafka_errno2err (int errnox);

一般在函数调用失败的地方的日志打印中,加入上面2个函数:先rd_kafka_errno2err,再rd_kafka_err2str。

如:

#include #include #include using namespace std;

enum

{

OPERATOR_OK = 0, //成功 OPERATOR_ERR = 1, //失败 MALLOC_MEMORY_ERR = 2, //申请内存空间失败 FUNCTION_PARAM_NULL = 3,//函数参数为空 FUNCTION_PARAM_ERR = 4 //函数参数错误 //省略......};

/**@fn Div* @brief 除法函数* @param[in] const int a 被除数* @param[in] const int b 除数* @param[out] int &outData 结果值* @return int**/

int Div(const int a,const int b, int &outData)

{

if(b <= 0)

{

fprintf(stderr,"Div param is err.");

return FUNCTION_PARAM_ERR;

}

outData = a/b;

return OPERATOR_OK;

}

/**@fn err2str* @brief 将错误码转换为对应字符串* @param[out] const int ierrno 待转换的错误码* @return 转换后的错误码字符串**/

const char* err2str(const int ierrno)

{

if(OPERATOR_OK >ierrno || ierrno > FUNCTION_PARAM_ERR)

{

puts("err2str param is err.");

return NULL;

}

switch (ierrno) {

case OPERATOR_OK:return "OPERATOR_OK";break;

case OPERATOR_ERR:return "OPERATOR_ERR";break;

case MALLOC_MEMORY_ERR:return "MALLOC_MEMORY_ERR";break;

case FUNCTION_PARAM_NULL:return "FUNCTION_PARAM_NULL";break;

case FUNCTION_PARAM_ERR:return "FUNCTION_PARAM_ERR";break;

default:return NULL;break;

}

}

int main()

{

int a = 6, b = 2;

int iResult = 0;

if(OPERATOR_OK != Div(a,b,iResult))

{

printf("Div failed[%d]-[%s]\n",Div(a,b,iResult), err2str(Div(a,b,iResult)));

return -1;

}

std::cout<

return 0;

}

打印结果

Div: 3

更多技术干货见个人微信公众号: 雅俗不共赏 ,扫描关注不迷路~

c枚举类型enum例题_c语言之枚举类型(enum)相关推荐

  1. c枚举类型enum例题_C语言--enum,typedef enum 枚举类型详解

    原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/ 有改动 C语言详解 - 枚举类型 注:以下全部代码的执行环 ...

  2. c枚举类型enum例题_c枚举类型enum用法 枚举类型enum用法 怎么去取所有

    JUDGE(S W ) 指 W 属于 S 枚举类型还是自定义函数里的2个变量不要太久太久不联系我,我怕我一不小心把你忘了. (1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素 ...

  3. 动态语言,静态类型,强类型定义语言,弱类型定义语言,

    1 动态语言和静态语言 通常我们所说的动态语言.静态语言是指动态类型语言和静态类型语言.    1 动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时 ...

  4. c语言中时间类型的变量,C语言变量的类型

    C语言变量的类型 变量要有变量名,在内存中占据一定的存储单元,存储单元里存放的是该变量的值.不同类型的变量其存储单元的大小不同,变量在使用前必须定义.那么C语言变量的类型有哪些呢,一起来看看! (一) ...

  5. 枚举类型enum例题_10.1 C++枚举类型

    C++枚举类型 在C++中,如果一个变量只有几种可能的值,可以定义为枚举类型.枚举是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内. C++声明枚举类型用enum开头. enum wee ...

  6. c语言枚举常量,浅述C语言中枚举enum的用法

    本文举例说明C语言中enum枚举关键字的用法. 用来同时定义多个常量 利用enum定义月份的例子如下. #includeenumweek{Mon=1,Tue,Wed,Thu,Fri,Sat,Sun}; ...

  7. c语言正数与负数相加_C语言数据基本类型(1)

    1.原码:一个数的原码(原始的二进制码)有如下特点: 最高位做为符号位,0表示正,为1表示负 其它数值部分就是数值本身绝对值的二进制数 负数的原码是在其绝对值的基础上,最高位变为1 注:原码表示法简单 ...

  8. c语言存储类型关键字作用,C语言, 存储类型关键字?

    1.C语言的数据类型分类 C语言的数据类型分类: 基本数据类型: 整型int 字符型char 浮点型: 单精度浮点型float 双精度浮点型double 构造数据类型: 数组(如int a[]) 结构 ...

  9. C语言实现文件类型统计程序,C语言实现文件类型统计函数

    #include#include#include#include#include#include#include #define FTW_F 1 //标记非目录文件 #define FTW_D 2 / ...

最新文章

  1. Asp.Net下的DataGrid的多层表头
  2. Codeforces Round #469 (Div. 2) A/B
  3. hibernate tools for eclipse plugins在线怎么安装
  4. python super 参数问题
  5. OpenJ_Bailian——4115鸣人和佐助(带状态的A*)
  6. MVC 顶层设计-ModelAndView
  7. codeforces gym-101736 Dessert First Strategy 最小割
  8. 5-10多分支网络结构
  9. C++ static关键字作用讲解
  10. python学习(八)----外星人入侵(项目篇)
  11. 用C#开发Windows服务
  12. 数据库管理员详细介绍
  13. android 裁剪图片工具,十大最佳Android图像裁剪(裁剪小部件)库
  14. <数据结构>链表实战之单链表与双链表的增删改查
  15. Proftpd配置文件
  16. 调度器锁rt_enter_critical() rt_exit_critical()
  17. cocos creator制作游戏实战-Flak Cannon(二)
  18. 【C++】—— STL简介(了解)
  19. 孙陶然:创业是从零开始的一次全新旅程
  20. 医学领域图像相关自述

热门文章

  1. 自媒体娱乐热点素材怎么找?-即时热榜
  2. IT运维审计:新手入门之服务器运维操作要点
  3. 【CSP-J】【图论】【最短路】加工零件
  4. php个人空间源码,PHP安装 - 牛牛牛大棚的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. matlab如何离散椭圆方程,给出一些椭圆上离散的点的横纵坐标,怎么用matlab拟合出椭圆方程...
  6. linux人脸识别终端是什么意思,瑞芯微如何看待天波首发得RV1109 Linux人脸识别终端...
  7. 拼多多服务器请求失败在手机上如何修复,拼多多登录不了怎么办?怎么解决?...
  8. html怎样制作背题模式和答题模式,科目一背题模式还是答题模式,技巧口诀答题...
  9. lvgl 8 中文内置字库配置
  10. 偶像来了 | 英雄请一起跳支舞!