枚举

原创 2016年08月31日 15:36:01

1.我们为什么要用枚举类型?

        在很多程序中,我们需要部分变量具有某些特殊含义的值,例如布尔变量就具有两个值,非真即假。但是在实际运用中不是每种事物都只有两种取值,有的变量就可能有几种取值,并且每种取值都有其特殊含义。例如,扑克牌的的花色就有四种取值:“红桃”,“黑桃”,“梅花”,“方片”(♥️,♠️,♣️,♦️)。一个星期的星期几也有几种取值,“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”,“Saturday”,“Sunday”(星期一,星期二,星期三,星期四,星期五,星期六,星期日)等。像这样的特殊一个变量里只包含一些常量的数据类型,就定义为枚举类型,所谓枚举是指将变量的值一一列举出来,变量只限于列举出来的值的范围内取值。 

2.枚举类型的定义?

      枚举类型的定义:

    enum 枚举名{
    枚举常量标识符[=整型常数], 
    枚举常量标识符[=整型常数],
    ...
    枚举常量标识符[=整型常数]
    } 枚举变量;

如果枚举没有初始化, 即省掉"[=整型常数]"时, 则从第一个标识符开始, 顺次赋给标识符0, 1, 2, ...。但当枚举中的某个成员赋值后, 其后的成员按依次加1的规则确定其值。
例如:
enum mon{Jan,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec}m; 
因为C语言会把枚举变量和常量作为整数来处理。所以在枚举mon中Jan,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec分别表示0,1,2,3,4,5,6,7,8,9,10,11。
我们可以为枚举常量选择不同的值,如我们需要Dec为12,May为5可以这样定义:
enum mon{Jan,Feb,Mar,Apr,May = 5,June,July,Aug,Sep,Oct,Nov,Dec = 12}m;
如果我们分别要让他们表示[1,12]中的一个整数,我们可以这样定义:
enum mon{Jan = 1,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec}m;

    我们只需要定义枚举中的第一个Jan = 1,后面的数不需要定义会自动递增1,所以枚举mon的取值同样是[1,12]。

3.枚举类型的使用。

(1)使用枚举类型,输入星期几的数字,查询对应的星期几的英文。

#include<stdio.h>

int main()
{
    enum weekday {sun,mon,tue,wed,thu,fri,sat} day;
    int w;
    
    printf("input a number(0--6):");
    scanf("%d",&w);
    
    day=(enum weekday)w;  //将整数赋值给枚举变量时要进行强制类型装换
    switch(day)
    {
        case sun: printf("sunday\n");break;
        case mon: printf("monday\n");break;
        case tue: printf("tuesday\n");break;
        case wed: printf("wednesday\n");break;
        case thu: printf("thursday\n");break;
        case fri: printf("friday\n");break;
        case sat: printf("satday\n");break;
        default: printf("input error\n");break;
    }
    return 0;
}


(2)枚举的综合使用,具体知识点见代码注释。

#include<stdio.h>

enum Season {spring, summer = 100, fall = 96, winter};

typedef enum {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday} Weekday;

int main() {
    
    printf("spring = %d\n", spring);  // 输出spring自动初始化的整数值
    printf("summer = %d\n", summer); // 输出summer被初始化为100的整数值
    printf("summer + fall = %d \n", fall+winter); // 输出被初始化的summer + fall的整数值
    
    enum Season mySeason = winter; // 使用枚举类型创建一个变量mySeason并赋初值winter
    
    if(winter == mySeason)
        printf("mySeason is winter\n"); // 证明枚举类型的比较实际是对应整数的比较1
    
    int x = 100;
    
    if(x == summer)
        printf("x is equal to summer\n"); // 证明枚举类型的比较实际是对应整数的比较2
    
    printf("%lu bytes\n", sizeof(spring)); // 证明枚举类型常量是一个整形
    printf("sizeof Weekday is: %lu\n", sizeof(Weekday)); // 证明枚举变量是一个整形
    
    /* 根据今天判断明天是星期几 */
    Weekday today = Saturday;
    Weekday tomorrow;
    if(today == Monday)
        tomorrow = Tuesday;
    else
        tomorrow = (Weekday) (today + 1);
    return 0;
}

4.使用枚举类型的注意点。

(1)enum是关键字,标识枚举类型。定义枚举类型必须用enum开头。

(2)枚举数据表中的名字是程序员自己设定,这些名字只是一个符号。但注意命名时要提高程序的可读性。

(3)枚举数据表的值都是整数(默认从0开始每一次递增1)。

(4)可以在定义类型时对枚举常量初始化。

(5)枚举类型可以进行比较。

(6)枚举常量不是字符串,不能用%s方式输出字符串。

(7)因为枚举类型是常量,所以不能对枚举类型进行赋值运算。

  (8)  将整数赋值给枚举变量时要进行强制类型装换。

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

 (10)  同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。



版权声明:本文为博主原创文章,未经博主允许不得转载。

Go语言学习(三)枚举和类型

package main import "fmt" //1.枚举的使用 // 枚举指一系列相关的常量,比如下面关于一个星期中每天的定义。通过上一节的例子,我们 // 看到可以用在 const 后跟一对...
  • mChenys
  • mChenys
  • 2016年03月23日 21:44
  • 5371

浅谈使用单元素的枚举类型实现单例模式

简介 使用单元素的枚举实现单例模式简介通常情况下,我们写单例模式的时候无非就是三个步骤:构造器私有化,声明私有静态变量,提供静态获取实例的方法。简单说就是以下这种方式:class SingletonA...
  • huangyuan_xuan
  • huangyuan_xuan
  • 2016年08月12日 22:47
  • 5515

比较java枚举成员使用equal还是==

问题 我知道Java枚举会被编译成一个包含私有构造参数和一堆静态方法的类,当去比较两个枚举的时候,总是使用equals()方法,例如: public useEnums(SomeEnum a...
  • lgh1992314
  • lgh1992314
  • 2016年11月22日 20:34
  • 7668

面向对象编程常见分类(类,结构体,事件,委托,枚举)

  • 2018年01月12日 10:09
  • 248KB
  • 下载

esedatebaseview枚举器

  • 2016年09月07日 17:15
  • 94KB
  • 下载

枚举串口小工具

  • 2015年07月22日 13:58
  • 126KB
  • 下载

枚举java基础知识点

  • 2017年11月03日 12:39
  • 27KB
  • 下载

数据结构与算法_枚举(穷举)算法

  • 2017年11月14日 23:03
  • 20.2MB
  • 下载

枚举OPC server端itemID的方法

  • 2016年01月04日 08:44
  • 2KB
  • 下载

网页枚举源码

  • 2013年12月21日 02:57
  • 93KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:枚举
举报原因:
原因补充:

(最多只允许输入30个字)