原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/

有改动

C语言详解 - 枚举类型

注:以下全部代码的执行环境为VC++ 6.0

在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是:

#define MON 1

#define TUE 2

#define WED 3

#define THU 4

#define FRI 5

#define SAT 6

#define SUN 7

在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。

1. 定义一种新的数据类型 - 枚举型

以下代码定义了这种新的数据类型 - 枚举型

enum DAY

{

    MON=1, TUE, WED, THU, FRI, SAT, SUN

};

(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。

(2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。

(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。

(4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。

(5) 枚举型是预处理指令#define的替代。

(6) 类型定义以分号;结束。

C语言深度解剖:

一般的定义方式如下:
enum enum_type_name
{
   ENUM_CONST_1,
   ENUM_CONST_2,
   ...
   ENUM_CONST_n
} enum_variable_name;

注意:enum_type_name 是自定义的一种数据数据类型名,而enum_variable_name 为enum_type_name类型的一个变量,也就是我们平时常说的枚举变量。实际上enum_type_name类型是对一个变量取值范围的限定,而花括号内是它的取值范围,即enum_type_name 类型的变量enum_variable_name 只能取值为花括号内的任何一个值,如果赋给该类型变量的值不在列表中,则会报错或者警告。ENUM_CONST_1、ENUM_CONST_2、...、ENUM_CONST_n,这些成员都是常量,也就是我们平时所说的枚举常量(常量一般用大写)。

2. 使用枚举类型对变量进行声明

新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float, 双精度浮点型double, 字符型char, 短整型short等等。用这些基本数据类型声明变量通常是这样:

char a; //变量a的类型均为字符型char

char letter;

int x, y, z; //变量x,y和z的类型均为整型int

int number;

double m, n;

double result; //变量result的类型为双精度浮点型double

既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。

方法一:枚举类型的定义和变量的声明分开

enum DAY

{

    MON=1, TUE, WED, THU, FRI, SAT, SUN

};

enum DAY yesterday;

enum DAY today;

enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY

enum DAY good_day, bad_day; //变量good_day和bad_day的类型均为枚举型enum DAY

方法二:类型定义与变量声明同时进行:

enum //跟第一个定义不同的是,此处的标号DAY省略,这是允许的。这种方式相当于定义了

{                                                                                                                                 一个枚举变量,参考

    saturday,                                                                                                          上面 C语言深度解剖 定义

    sunday = 0,

    monday,

    tuesday,

    wednesday,

    thursday,

    friday

} workday; //变量workday的类型为枚举型enum DAY

workday=friday;

sizeof(workday)=4;

enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //变量days的类型为枚举型enum week

enum BOOLEAN { false, true } end_flag, match_flag; //定义枚举类型并声明了两个枚举型变量

方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:

typedef enum workday  //此处的workday可以省略,或者改成其他,不会影响后面

{

    saturday,

    sunday = 0,

    monday,

    tuesday,

    wednesday,

    thursday,

    friday

} workday; //此处的workday为枚举型enum workday的别名,类似于int

workday today, tomorrow; //此处的workday颜色对应,变量today和tomorrow的类型为枚举型workday,也即enum workday

enum workday中的workday可以省略:

typedef enum

{

    saturday,

    sunday = 0,

    monday,

    tuesday,

    wednesday,

    thursday,

    friday

} workday; //此处的workday为枚举型enum workday的别名

workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday

也可以用这种方式:

typedef enum workday   //VC6.0和MDK编译均未通过

{

    saturday,

    sunday = 0,

    monday,

    tuesday,

    wednesday,

    thursday,

    friday

};

workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday

注意:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。错误示例如下所示:

错误声明一:存在同名的枚举类型

typedef enum

{

wednesday,

thursday,

friday

} workday;

typedef enum WEEK

{

saturday,

sunday = 0,

monday,

} workday;

错误声明二:存在同名的枚举成员

typedef enum

{

wednesday,

thursday,

friday

} workday_1;

typedef enum WEEK

{

wednesday,

sunday = 0,

monday,

} workday_2;

3. 使用枚举类型的变量

3.1 对枚举型的变量赋值。

实例将枚举类型的赋值与基本数据类型的赋值进行了对比:

方法一:先声明变量,再对变量赋值

#include

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };

void main()

{

int x, y, z;

x = 10;

y = 20;

z = 30;

enum DAY yesterday, today, tomorrow;

yesterday = MON;

today = TUE;

tomorrow = WED;

printf("%d %d %d \n", yesterday, today, tomorrow);

}

方法二:声明变量的同时赋初值

#include

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };

void main()

{

int x=10, y=20, z=30;

enum DAY yesterday = MON, today = TUE, tomorrow = WED;

printf("%d %d %d \n", yesterday, today, tomorrow);

}

方法三:定义类型的同时声明变量,然后对变量赋值。

#include

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } yesterday, today, tomorrow;

int x, y, z;

void main()

{

x = 10; y = 20; z = 30;

yesterday = MON;

today = TUE;

tomorrow = WED;

printf("%d %d %d \n", x, y, z); //输出:10 20 30

printf("%d %d %d \n", yesterday, today, tomorrow); //输出:1 2 3

}

方法四:类型定义,变量声明,赋初值同时进行。

#include

enum DAY

{

MON=1,

TUE,

WED,

THU,

FRI,

SAT,

SUN

}

yesterday = MON, today = TUE, tomorrow = WED;

int x = 10, y = 20, z = 30;

void main()

{

    printf("%d %d %d \n", x, y, z); //输出:10 20 30

    printf("%d %d %d \n", yesterday, today, tomorrow); //输出:1 2 3

}

3.2 对枚举型的变量赋整数值时,需要进行类型转换。

#include

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };

void main()

{

    enum DAY yesterday, today, tomorrow;

    yesterday = TUE;

    today = (enum DAY) (yesterday + 1); //类型转换

    tomorrow = (enum DAY) 30; //类型转换

    //tomorrow = 3; //错误

    printf("%d %d %d \n", yesterday, today, tomorrow); //输出:2 3 30

}

 

问题:

enum Color
{
GREEN = 1,
RED,
BLUE,
GREEN_RED = 10,
GREEN_BLUE
}ColorVal;

1.枚举能做到事,#define宏能不能都做到?如果能,那为什么还需要枚举?

2.求sizeof(ColorVal)
枚举可以自增1,这样不用每一个值都定义,而宏必须每个值都定义。而且枚举是一个集合,代表一类值,像你代码中的颜色归为一类,方便使用,而宏不能形成集合。
sizeof(ColorVal)是4,因为ColorVal是一个枚举变量,而枚举变量代表一个整数(如ColorVal = RED),而整数是4个字节。

C语言--enum,typedef enum 枚举类型详解的更多相关文章

  1. 测者的测试技术手册:Junit单元测试遇见的一个枚举类型的坑(枚举类型详解)

    Enum的简介 枚举类型很早就在计算机语言中存在了,主要被用来将一组相似的值包含进一种类型中,这种类型的名称被定义成独一无二的类型描述符,这就是枚举类型. 在java语言中,枚举类型是一个完整功能的类 ...

  2. Java中的枚举类型详解

    枚举类型介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义 ...

  3. C++枚举类型详解

    原创作品,转载请注明来源:http://www.cnblogs.com/shrimp-can/p/5171110.html  一.枚举类型的定义 enum 类型名 {枚举值表}: 类型名是变量名,指定 ...

  4. 转载 - C - 枚举类型详解

    出处:http://www.cnblogs.com/JCSU/articles/1299051.html 注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可 ...

  5. Java魔法堂:枚举类型详解

    一.前言 Java的枚举类型相对C#来说具有更灵活可配置性,Java的枚举类型可以携带更多的信息. // C# enum MyColor{ RED = , BLUE = } Console.Write ...

  6. java枚举类型详解

      枚举类型是JDK1.5的新特性.显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类.而这些类都是类库中Enum类的子类(java.lang.Enum<E>).它 ...

  7. Go语言基础之9--指针类型详解

    一. 变量和内存地址 每个变量都有内存地址,可以说通过变量来操作对应大小的内存 注意:通过&符号可以获取变量的内存地址 通过下面例子来理解下: 实例1-1 package main impor ...

  8. C++之enum枚举量声明、定义、使用与枚举类详解

    C++之enum枚举量声明.定义.使用与枚举类详解 学习一个东西,首先应该指导它能做什么,其次去知道它怎么去做,最后知道为什么去这么做. 知其然知其所以然.不能冒进 ,一步一步的慢慢来.

  9. C语言第十讲,枚举类型简单说明

    C语言第十讲,枚举类型简单说明 一丶C语言中的枚举类型(ENUM) 在我们实际工作中,或者编写代码中.我们有的时候会用固定的值.而且不是很多. 这个时候就可以使用枚举了.如果我们使用#define显然 ...

随机推荐

  1. 【剑指offer 面试题15】链表中倒数第K个结点

    思路: 定义两个指针同时指向head,第一个指针先走K-1步,随后二个指针同时移动,当第一个指针到末尾处时,第二个指针所指向的即为倒数第K个结点. #include <iostream> ...

  2. [Irving]WPF Invalid character in the given encoding. Line xx, position xx.' XML is not valid.

    WPF开发中发现Xaml界面中突然抽风似的提示错误 Invalid character in the given encoding. Line xx, position xx.' XML is not ...

  3. firebug console使用

    Firebug内置一个console对象,提供5种方法,用来显示信息. console.log("Hello World") console.info("这是info&q ...

  4. Leetcode Largest Number c++ solution

    Total Accepted: 16020 Total Submissions: 103330     Given a list of non negative integers, arrange t ...

  5. C语言相关图书推荐

    C Primer Plus(第5版 中文版) 作      者 [美] 普拉塔(Prata S.) 著:云巅工作室 编 出 版 社 人民邮电出版社 出版时间 2005-02-01 版      次 1 ...

  6. Hadoop上路-02_Hadoop FS Shell

    一.上传文件/目录 1)put 从本地文件系统中复制N个源路径到目标文件系统. 2)copyFromLocal 源路径须是一个本地文件. 二.下载文件/目录 1)get 复制文件到本地文件系统. 2) ...

  7. 机器学习框架Scikit Learn的学习

    一   安装 安装pip 代码如下:# wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=83 ...

  8. redis的sets类型

    set是集合 , 它是string类型的无序集合 . set是通过hash table 实现的 , 添加.删除和查找的复杂度都是O(1) . 对集合我们可以取并集.交集.差集.通过这些操作我们可以实现 ...

  9. Hellow world!

    其实一年前开始就有了些许开篇技术博客的想法,一直觉得写这些的人都一定好牛×.现刚毕业,我也是时候朝牛×之路迈进了.当然,我才刚入门不久,前路漫漫,需一步一脚印,先打算把平常遇到的一些问题与关注的东西都 ...

  10. poj 3268 Silver Cow Party(最短路)

    Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17017   Accepted: 7767 ...