在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等。

以每周七天为例,我们可以使用#define命令来给每天指定一个名字:

#include

#define Mon 1

#define Tues 2

#define Wed 3

#define Thurs 4

#define Fri 5

#define Sat 6

#define Sun 7

int main(){

int day;

scanf("%d", &day);

switch(day){

case Mon: puts("Monday"); break;

case Tues: puts("Tuesday"); break;

case Wed: puts("Wednesday"); break;

case Thurs: puts("Thursday"); break;

case Fri: puts("Friday"); break;

case Sat: puts("Saturday"); break;

case Sun: puts("Sunday"); break;

default: puts("Error!");

}

return 0;

}

运行结果:

5↙

Friday

#define命令虽然能解决问题,但也带来了不小的副作用,导致宏名过多,代码松散,看起来总有点不舒服。C语言提供了一种枚举Enum类型,能够列出所有可能的取值,并给它们取一个名字。

枚举类型的定义形式为:

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

enum是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途;typeName是枚举类型的名字;valueName1, valueName2, valueName3, ......是每个值对应的名字的列表。注意最后的;不能少。

例如,列出一个星期有几天:

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

可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues ...... Sun 对应的值分别为 0、1 ...... 6。

也可以给每个名字都指定一个值:

enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };

更为简单的方法是只给第一个名字指定值:

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

这样枚举值就从 1 开始递增,跟上面的写法是等效的。

枚举是一种类型,通过它可以定义枚举变量:

enum week a, b, c;

也可以在定义枚举类型的同时定义变量:

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

有了枚举变量,就可以把列表中的值赋给它:

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

enum week a = Mon, b = Wed, c = Sat;

或者:

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

判断用户输入的是星期几。

#include

int main(){

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

scanf("%d", &day);

switch(day){

case Mon: puts("Monday"); break;

case Tues: puts("Tuesday"); break;

case Wed: puts("Wednesday"); break;

case Thurs: puts("Thursday"); break;

case Fri: puts("Friday"); break;

case Sat: puts("Saturday"); break;

case Sun: puts("Sunday"); break;

default: puts("Error!");

}

return 0;

}

运行结果:

4↙

Thursday

需要注意的两点是:

1 枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。

2 Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。

枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。

对于上面的代码,在编译的某个时刻会变成类似下面的样子:

#include

int main(){

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

scanf("%d", &day);

switch(day){

case 1: puts("Monday"); break;

case 2: puts("Tuesday"); break;

case 3: puts("Wednesday"); break;

case 4: puts("Thursday"); break;

case 5: puts("Friday"); break;

case 6: puts("Saturday"); break;

case 7: puts("Sunday"); break;

default: puts("Error!");

}

return 0;

}

Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用&取得它们的地址。这就是枚举的本质。

我们知道,case 关键字后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量,正是由于 Mon、Tues、Wed 这些名字最终会被替换成一个整数,所以它们才能放在 case 后面。

枚举类型变量需要存放的是一个整数,我猜测它的长度和 int 应该相同,下面来验证一下:

#include

int main(){

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

printf("%d, %d, %d, %d, %d\n", sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed), sizeof(int) );

return 0;

}

运行结果:

4, 4, 4, 4, 4

深入理解Java枚举类型(enum)

https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...

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

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

[编程] C语言枚举类型(Enum)

C语言枚举类型(Enum):定义形式为:enum typeName{ valueName1, valueName2, valueName3, ...... };enum 类型名{名字1,名字2} 枚举 ...

【转】java枚举类型enum的使用

原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

C# 中的枚举类型 enum (属于值类型)

原文 C# 中的枚举类型 enum (属于值类型) C# 支持两种特殊的值类型:枚举和结构. 声明枚举:声明时要声明所有可能的值. using System; using System.Collect ...

人生苦短之Python枚举类型enum

枚举类型enum是比较重要的一个数据类型,它是一种数据类型而不是数据结构,我们通常将一组常用的常数声明成枚举类型方便后续的使用.当一个变量有几种可能的取值的时候,我们将它定义为枚举类型.在Python ...

全面解读Java中的枚举类型enum的使用

这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw ...

Java基础之枚举类型Enum的使用

Java基础之枚举类型Enum的使用 定义 public enum AccruedCleanEnum { SPREAD("1","发票"),OTHER(&quo ...

《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...

随机推荐

【Mail】搭建邮件服务器(LAMP+Postfix+Dovcot+PostfixAdmin+Roundcubemail)

大纲 一.mail部署说明 二.安装准备 三.LMAP环境配置 四.配置postfixadmin 五.配置postfix 六.配置dovecot 七.测试SMTP和POP3服务 八.配置Roundcu ...

bug的处理流程

又属于一篇普及文,希望自己在被各种技术吸引的同时,能时常来整理和总结软件测试最基本的知识. 从刚工作时接触的第一个缺陷管理工具禅道,到redmine.JIRA.bugzilla ,再到现在的QC,当然 ...

node.js(五)字符串转换

1.stringify函数的基本用法 stringify函数的作用就是序列化对象,也就是说将对象类型转换成一个字符串类型(默认的分割符("&")和分配符("=&q ...

Spring Boot Starter 介绍

http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...

POJ-2993 Emag eht htiw Em Pleh---棋盘模拟

题目链接: https://vjudge.net/problem/POJ-2993 题目大意: 输入和输出和这里相反. 思路: 模拟题,没啥算法,直接模拟,不过为了代码精简,还是花了一点心思的 #in ...

android 手机权限管理——PermissionsDispatcher

Android6.0 之后某些权限需要动态申请,相比于之前版本复杂了许多.不过已经有大神给我们写好了框架(PermissionsDispatcher),我们用起来还是很方便. 1.添加引用 根据 gr ...

swift static func 和 class func

Swift中static func 相当于class final func.禁止这个方法被重写 clas func  可以被继承重写

delphi 中record 的类操作符重载简介

今天简单介绍一下 delphi 中record 的类操作符重载使用,就是如何 实现 record 之间的简单操作. 关于类操作符重载 ,大家可以看官方的文档. Delphi allows certai ...

[Object Tracking] How to learn Active contour model - Snake Model

常见四种跟踪的思路: 区域:人体肢体识别.跟踪 模型:人体面部识别.跟踪 特征:摄像头3D定位 主动轮廓:(蛇模型属于这er,数学基础,也是最流行的一个目前) ...

bzoj3252: 攻略(贪心)

/* 因为权值都是正的, 所以贪心的正确性能保证 然后重链贪心跑一下就好了 */ #include #include #include&l ...

c语言 枚举大小写,C语言枚举类型(Enum)深入理解相关推荐

  1. mysql 枚举_详解MySQL数据类型之枚举类型ENUM的用法

    本节主要内容: MySQL数据类型之枚举类型ENUM MySQL数据库提供针对字符串存储的一种特殊数据类型:枚举类型ENUM,这种数据类型可以给予我们更多提高性能.降低存储容量和降低程序代码理解的技巧 ...

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

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

  3. c枚举类型enum例题_c语言之枚举类型(enum)

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

  4. C语言的枚举类型(Enum)

    参考:C语言的枚举类型(Enum) 地址:https://blog.csdn.net/aliyonghang/article/details/123615803?spm=1001.2014.3001. ...

  5. c语言枚举类型enum用法及应用

    大家好,我是无际. 今天跟大家讲一下我在产品开发时,用枚举(enum)的一些骚操作. 我跟你保证,今天的内容绝对是你在书本和视频学不到的. 为什么要讲枚举呢? 因为我发现它是一个容易被遗忘,同时又非常 ...

  6. c语言枚举类型enum用法参数,C语言枚举类型(Enum)

    在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等. 以每周七天为例, ...

  7. C语言程序设计(Part Ⅸ)——链表/共用体类型/枚举类型

    C语言程序设计(Part Ⅸ)的整理笔记,若有错误,欢迎指正. 用指针处理链表 如果有一批数据要存储和引用,有两种方法: 一种方法是采取分配固定存储单元的方法,例如数组.但是在程序执行期间,数组的大小 ...

  8. C#语言基础——结构体和枚举类型

    结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...

  9. 学习笔记17-C语言-结构、联合、枚举

    结构: struct 结构是由程序猿自己设计的一种数据类型,用于描述一个事务的各项数据,由若干个不同的基础数据类型组成.设计结构:struct 结构体名{类型 成员名:...}:定义结构体变量stru ...

  10. c语言枚举如何当函数返回值,C语言学习五 — 数组与枚举

    数组 C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比如 numbe ...

最新文章

  1. CSS实现自适应浏览器宽度的正方形
  2. 自动化学习的正确姿势
  3. Tomcat5内存简单优化
  4. java url特殊字符处理_简单实例处理url特殊符号处理(2种方法)
  5. mysql恢复 报错_Mysql 数据恢复报错
  6. 搭建Cacti监控系统(三)-- 监控Linux 主机
  7. linux安装挂载samba,【Linux系列】Centos7安装Samba并将工作区挂载到win(八)
  8. 机器学习——Day 1 数据预处理
  9. 【渝粤教育】国家开放大学2018年春季 0680-21T会计基础知识 参考试题
  10. 解决:CWnd::SetWindowText报Assertion failure
  11. 灰度图像加性噪声污染和运动模糊图像复原
  12. Tomcat介绍和MyEclipse搭建DRP系统
  13. kafka 偏移量latest、earliest
  14. DZone每日必读-news: 指导软件团队取得成功的 4 种方法
  15. 微信小程序开发—— tabbar 配置
  16. 关于采购订单、销售订单、工作单行上的库存详细信息说明
  17. windows下安装speedtest的经历和问题
  18. 智能坐便器雷达感应技术,微波雷达感应模组应用,雷达传感器方案
  19. 这,才是有本事的男人
  20. Unity 打包快手

热门文章

  1. 单片机用c语言编程软件手机版,单片机C语言编程软件(mikroc pro for pic)下载 V7.1.0 官方版 - 比克尔下载...
  2. Java和python哪个好,学哪个有用。
  3. fritzing元件太少_fritzing传感器元件库
  4. python调用phone库查询手机号码相关信息
  5. 截图工具当前未在计算机上运行 请重启_截图并订在屏幕上 用作对比、对照、参考,非常实用...
  6. 4S店销售顾问有福了,小帮软件解决“二次录入”难题--二次录入
  7. 开源商城小程序源码(小程序商城完整版源码)附搭建部署教程
  8. CentOS7 完全卸载MySQL
  9. python notebook_Python Notebook (Jupyter Notebook) 介绍
  10. 南阳理工acm 1007GCD