(九)字符串和字符 -- 1. 枚举的原理

1. 枚举的原理

  • 枚举(enumeration)
    列出类型值域中所有元素的处理方式。

  • 枚举类型(enumeration type)
    通过列出它的所有元素来定义的类型。

  • 整数编码(integer encoding)
    为枚举类型的每个元素赋一个整数值的过程。


1.1 将枚举类型表示为整数

表示C语言中的枚举类型,一种方法是:
显式地用int类型,然后用#define功能引入一些新的常量名。

例如,定义每周中的每一天的名字:

#define Sunday 0
#define Monday 1
#define Tuesday 2
#define Wednesday 3
#define Thursday 4
#define Friday 5
#define Saturday 6

int weekday;
weekday=Monday;

1.2 定义新的枚举类型

定义新的枚举类型的语法形式:


例如,引入枚举类型来定义一周中每天的名字:

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

这个定义引入了一个新的类型weekdayT,它在程序中可以和其他类型一样使用,如intbool
名字结尾处的大写字母T强调名字weekdayT是一种类型,而不是一个变量。

在程序中使用枚举类型的好处在于该类型名能传递一些有用的信息。
将一个变量声明为int类型会使任何一个读此程序的人认为该变量保存的是整数;该整数代表的是一个星期中的某一天的功能完全丧失了。


在定义报税身份类型时,需要指定常量的值,如下所示:

typedef enum
{
    Single = 1,
    MarriedFillingJointReturn = 2,
    MarriedFillingSeparateReturn = 3,
    HeadOfHousehold = 4,
    QualifyingSurvivingSpouse = 5
} fillingStatusT;

该定义可作进一步简化。若无等号,编译器依次对每一个元素连续赋值:

typedef enum
{
    Single = 1,
    MarriedFillingJointReturn,
    MarriedFillingSeparateReturn,
    HeadOfHousehold,
    QualifyingSurvivingSpouse
} fillingStatusT;

1.3 枚举类型的操作

一旦在表达式中用到枚举类型的值时,C编译器自动将它转换为整数。

因为每个枚举常量都用一个整数值表示,所有涉及枚举类型的计算只是用到它的整型代码代替。

例如:

#include <stdio.h>

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

main() {
    int day;
    weekdayT weekday;
    weekday = Saturday;
    printf("%d\n", weekday);
}
6

注意:
在C语言中,使用枚举类型时要非常小心,因为编译器不检查计算的结果是否是某一枚举类型的合法成员。

例如:

weekday = weekday + 1;

如果weekday的值碰巧为Saturday,将取表示Saturday的值6,对它加1,把这个值7存回到变量weekday,尽管7不是weekdayT类型的合法元素。


1.4 标量类型

行为类似于整数的类型,如枚举类型,称为标量类型(scalartype) 。

在C语言中,当在表达式中使用标量类型时,它们被自动转换为整数。
此外,标量类型可以用在任何整数类型出现的地方。

假设directionT被定义为:

typedef enum
{
    North,
    East,
    South,
    West
} directionT;

函数返回参数指定的方向的反方向:

directionT OppositeDirection(directionT dir) {
    switch (dir) {
        case North: return South;
        case East: return West;
        case South: return North;
        case West: return East;
        default: printf("Illegal direction value.");
    } 
}

调用OppositeDirection(North) 将返回South。





参考
《C语言的科学和艺术》 —— 第9章 字符串和字符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值