注:以下全部代码的执行环境为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) 类型定义以分号;结束。

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

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


char     a; //变量a的类型均为字符型charchar     letter;int        x,           y,           z; //变量x,y和z的类型均为整型intint       number;double  m, n;double  result; //变量result的类型为双精度浮点型double

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

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

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

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


enum //跟第一个定义不同的是,此处的标号DAY省略,这是允许的。{    saturday,    sunday = 0,    monday,    tuesday,    wednesday,    thursday,    friday} workday; //变量workday的类型为枚举型enum DAY
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{    saturday,    sunday = 0,    monday,    tuesday,    wednesday,    thursday,    friday} workday; //此处的workday为枚举型enum workday的别名
workday today, tomorrow; //变量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{    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<stdio.h>/* 定义枚举类型 */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 <stdio.h>/* 定义枚举类型 */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 <stdio.h>/* 定义枚举类型,同时声明该类型的三个变量,它们都为全局变量 */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 <stdio.h>/* 定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量 */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 <stdio.h>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}

3.3 使用枚举型变量


#include<stdio.h>enum{     BELL          = '\a',    BACKSPACE = '\b',    HTAB         = '\t',    RETURN      = '\r',    NEWLINE    = '\n',     VTAB         = '\v',    SPACE       = ' '};enum BOOLEAN { FALSE = 0, TRUE } match_flag;void main(){    int index = 0;    int count_of_letter = 0;    int count_of_space = 0;    char str[] = "I'm Ely efod";    match_flag = FALSE;    for(; str[index] != '\0'; index++)        if( SPACE != str[index] )            count_of_letter++;        else        {            match_flag = (enum BOOLEAN) 1;            count_of_space++;        }        printf("%s %d times %c", match_flag ? "match" : "not match", count_of_space, NEWLINE);    printf("count of letters: %d %c%c", count_of_letter, NEWLINE, RETURN);}

输出:
match 2 times
count of letters: 10
Press any key to continue

4. 枚举类型与sizeof运算符


#include <stdio.h>enum escapes{     BELL      = '\a',    BACKSPACE = '\b',    HTAB      = '\t',    RETURN    = '\r',    NEWLINE   = '\n',     VTAB      = '\v',    SPACE     = ' '};enum BOOLEAN { FALSE = 0, TRUE } match_flag;void main(){    printf("%d bytes \n", sizeof(enum escapes)); //4 bytes    printf("%d bytes \n", sizeof(escapes)); //4 bytes    printf("%d bytes \n", sizeof(enum BOOLEAN)); //4 bytes    printf("%d bytes \n", sizeof(BOOLEAN)); //4 bytes    printf("%d bytes \n", sizeof(match_flag)); //4 bytes    printf("%d bytes \n", sizeof(SPACE)); //4 bytes    printf("%d bytes \n", sizeof(NEWLINE)); //4 bytes    printf("%d bytes \n", sizeof(FALSE)); //4 bytes    printf("%d bytes \n", sizeof(0)); //4 bytes}

5. 综合举例


#include<stdio.h>enum Season{    spring, summer=100, fall=96, winter};typedef enum{    Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}Weekday;void main(){    /* Season */    printf("%d \n", spring); // 0    printf("%d, %c \n", summer, summer); // 100, d    printf("%d \n", fall+winter); // 193    Season mySeason=winter;    if(winter==mySeason)        printf("mySeason is winter \n"); // mySeason is winter        int x=100;    if(x==summer)        printf("x is equal to summer\n"); // x is equal to summer    printf("%d bytes\n", sizeof(spring)); // 4 bytes    /* Weekday */    printf("sizeof Weekday is: %d \n", sizeof(Weekday)); //sizeof Weekday is: 4    Weekday today = Saturday;    Weekday tomorrow;    if(today == Monday)        tomorrow = Tuesday;    else        tomorrow = (Weekday) (today + 1); //remember to convert from int to Weekday}

枚举类型C语言规律用法总结的更多相关文章

  1. Language Guide (proto3) | proto3 语言指南(四)枚举类型

    枚举类型 定义消息类型时,可能希望其中一个字段只包含预定义值列表中的一个.例如,假设您想为每个SearchRequest添加一个corpus(语料库)字段,其中语料库的值可以是UNIVERSAL.WE ...

  2. java基础(十一) 枚举类型

    枚举类型Enum的简介 1.什么是枚举类型 枚举类型: 就是由一组具有名的值的有限集合组成新的类型.(即新的类). 好像还是不懂,别急,咱们先来看一下 为什么要引入枚举类型 在没有引入枚举类型前,当我 ...

  3. C语言——枚举类型用法

    1.枚举的定义 enum 枚举名{ 枚举元 素1,枚举元素2,枚举元素3...}: 2.使用枚举类型的好处 增加程序的可读性,我们都知道在计算机中所有信息都是用二进制来表示的,如果你用二进制来表示某件 ...

  4. enum枚举类型 的用法

    1.作为数组下标使用 enun  box{pencil, ruler}; void main() { string s[2]; s[pencil]="pencil"; s[rule ...

  5. Java枚举类型的用法

    JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 1.用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fia ...

  6. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

  7. C#中的枚举类型enum用法

    定义一个简单的枚举类型:   enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};        //这时候         Days.Sat = 0 ,后面依 ...

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

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

  9. C语言--enum,typedef enum 枚举类型详解

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

随机推荐

  1. hive分区表插入一条测试数据

    1.show create table tb_cdr;+-------------------------------------------------------+--+|             ...

  2. MQTT 连接服务端失败,报错客户机未连接(32104)

    和同事协同开发项目,在启动项目时偶尔报错连接不到MQTT 服务器. 原因是两个人开发同一个项目,连接MQTT时配置的 client-id 相同,在使用一个client-id连接到MQTT服务器后,再使 ...

  3. HLS协议解析

    1. 综述 HLS(HTTP Live Streaming) 把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些.HLS 协议由三部分组成:HTTP.M3U8.TS.这三部分中,HTT ...

  4. Oracle 表空间扩容

    1 系统表空间扩容 注:表空间监测或扩容方式很多,这里只提供一种方便使用的方法 1)查询SQL 注:需要输入百分比,如:90,就可查出使用率超过90%的表空间, with t as (select b ...

  5. mvp解读

    mvp存在的问题 1.业务复杂时,可能使得Activity变成更加复杂,比如要实现N个IView,然后写更多个模版方法. 2.业务复杂时,各个角色之间通信会变得很冗长和复杂,回调链过长. 3.Pres ...

  6. LC 712. Minimum ASCII Delete Sum for Two Strings

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  7. springboot整合mybatis时java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.

    时区问题造成的,解决方法是在数据源配置文件中在数据库链接处增加参数&serverTimezone=GMT%2B8对时区进行配置,配置为东八区. 修改前:spring.datasource.ur ...

  8. web站点放在nginx其他目录下

    web站点放在nginx其他目录下 .查看主配置文件 [root@bogon mysql]# cat /etc/nginx/nginx.conf user root root; worker_proc ...

  9. CreateCompatibleBitmap 的使用

    函数功能:该函数创建与指定的设备环境相关的设备兼容的位图. 函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight): 参 ...

  10. Django模板系统-母板和继承

    母板和继承 母版 html页面,提取多个页面的公共部分 定义多个block块,需要让子页面进行填充 <head> {% block page-css %} {% endblock %} & ...