C

C 知识量:16 - 74 - 317

14.6 枚举类型><

枚举简介- 14.6.1 -

枚举类型通过使用enum关键字,来创建一个新“类型”并指定它可具有的值。实际上,enum常量是int类型,因此,只要能使用int类型的地方就可以使用枚举类型,枚举类型实际上是通过声明符号名称来表示整型常量。

使用枚举类型的目的是提高程序的可读性。其语法与结构的语法相同,例如:

enum setColor {red, orange, yellow, green, blue, violet};
enum setColor color;

以上代码中,red、oranger等符号常量被称为枚举符,它们是int类型,所以枚举变量(比如color)可以是任意整数类型,前提是该整数类型可以储存枚举常量。例如,setColor的枚举符范围是0~5,所以编译器可以用unsignedchar来表示color变量。

enum常量- 14.6.2 -

从技术层面看,枚举符red等都是int类型的常量。例如以下代码:

#include <stdio.h>

int main(void) {
    enum setColor {
        red, orange, yellow, green, blue, violet
    };
    printf("red = %d, orange = %d\n", red, orange);
    system("pause");
    return 0;
}

运行结果为:

red = 0, orange = 1

red成为一个有名称的常量,代表整数0。类似地,其他标识符都是有名称的常量,分别代表1~5。因此,在声明数组时,可以用枚举常量表示数组的大小;在switch语句中,可以把枚举常量作为标签。

默认值- 14.6.3 -

默认情况下,枚举列表中的常量从0开始赋值。因此,下面的声明中c的值是2:

enum abc {a, b, c, d, e};

赋值- 14.6.4 -

在枚举声明中,可以为枚举常量指定整数值,例如:

#include <stdio.h>

int main(void) {
    enum abc {
        a, b, c = 10, d, e  //将c赋值为10
    };
    printf("a = %d,b = %d,c = %d,d = %d,e = %d\n", a, b, c, d, e);
    system("pause");
    return 0;
}

运行结果为:

a = 0,b = 1,c = 10,d = 11,e = 12

由上面代码可以看出,如果只给一个枚举常量赋值,没有对后面的枚举常量赋值,那么后面的常量会被赋予后续的值。

共享名称空间- 14.6.5 -

C语言使用名称空间(namespace)标识程序中的各部分,即通过名称来识别。

作用域是名称空间概念的一部分:两个不同作用域的同名变量不冲突;两个相同作用域的同名变量冲突。

名称空间是分类别的。在特定作用域中的结构标记、联合标记和枚举标记都共享相同的名称空间,该名称空间与普通变量使用的空间不同。这意味着在相同作用域中变量和标记的名称可以相同,不会引起冲突:

struct d{ double x; double y; };
int d;    // 在C中不会产生冲突

尽管如此,以两种不同的方式使用相同的标识符会造成混乱,因此不建议这样做。