enum枚举

scorlw 发布于

enum枚举

c++

简介

enum是计算机编程语言中的一种数据类型。枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。

定义说明

  1. 枚举类型定义的一般形式为:

enum 枚举名{ 枚举值表 };

在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。

例如:

该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。

  1. 枚举变量的说明

如同结构体(struct)和共用体(union)一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。

设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式:

1
2
3
4
5
6
7
8
9
enum weekday{sun,mon,tue,wed,thu,fri,sat};
enum weekday a,b,c;
//或者为:
enum weekday{sun,mon,tue,wed,thu,fri,sat};
weekday a,b,c;
//或者为:
enum weekday{sun,mon,tue,wed,thu,fri,sat}a,b,c;
//或者为:
enum {sun,mon,tue,wed,thu,fri,sat}a,b,c;

代码示意

C++ 允许程序员创建自己的数据类型,比如本节要将的枚举类型。枚举数据类型是一种由程序员定义的数据类型,其合法值是与它们关联的一组命名整数常量。

之所以被称为枚举类型,就是因为命名常量是作为数据类型定义的一部分而枚举或列出的,以下是枚举类型声明的示例:

enum Roster {Tom, Sharon, Bill, Teresa, John};

默认情况下,编译器设置第一个枚举量为 0,下一个为 1,以此类推。在上述示例中,Tom 的值将是 0,Sharon 的值为 1,等等。最后一个枚举量 John 的值为 4。

定义 Roster 数据类型的变量:

Roster student;

赋值:

student = Sharon;

测试变量的值:

if (student == Sharon)

注:

1.

即使枚举数据类型中的值实际存储为整数,也不能总是将整数值替换为符号名称。例如,不能使用下面的语句将 Sharon 赋值给 student:

student = 1; //错误

但是,可以使用整数值而不是符号名称来测试枚举变量。例如,以下两个 if 语句是等效的:

1
2
if (student == Bill)
if (student == 2)

2.

还可以使用关系运算符来比较两个枚举变量。例如,以下 if 语句确定存储在 student1 中的值是否小于存储在 student2 中的值:

if (student1 <student2)

3.

如前所述,默认情况下,枚举列表中的符号将被赋给整数值 0、1、2 等等。如果这不合适,则可以指定要赋给的值,如以下示例所示:

enum Department { factory = 1, sales = 2, warehouse = 4 };

请记住,如果为枚举符号赋值,则它们必须是整数。以下赋值语句将产生错误:

enum Department { factory = 1.1, sales = 2.2, warehouse = 4.4 }; //错误

4.

如果在赋值时省略了一个或多个符号,则它们将被赋给一个默认值,来看以下 2 个示例:

enum Colors { red, orange, yellow = 9, green, blue };

在该示例中,命名常量 red 将被赋值为 0,orange 将为 1,yellow 将为 9,green 将为 10,blue 将为 11。

enum Rooms { livingroom = 1, den, bedroom, kitchen };

在该示例中,livingroom 被赋值为 1,den 将为 2,bedroom 将为 3,kitchen 将为 4。

5.

枚举数据类型的目的之一是符号名称有助于使程序自我解释。但是,由于这些名称不 是字符串,它们仅在程序中使用。在使用 Roster 数据类型的示例中,以下两个语句将输出 一个 2,而不是名称 Sharon:

1
2
Roster student1 = Sharon;
cout << student1;

6.

因为枚举数据类型的符号名称与整数值相关联,所以它们可以在 switch 语句中使用,如下面的程序所示,该程序还演示了可以使用枚举的数据类型,而不实际创建该类型的任何变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;

// Declare the enumerated type
enum Roster { Tom = 1, Sharon, Bill, Teresa, John };
// Sharon - John will be assigned default values 2-5.

int main()
{
int who;
cin >> who;
switch (who)
{
case Tom :
cout << "Tom's birthday is January 3.\n";
break;
case Sharon :
cout << "Sharon's birthday is April 22.\n";
break;
case Bill :
cout << "Bill's birthday is December 19.\n";
break;
case Teresa :
cout << "Teresa's birthday is February 2.\n";
break;
case John :
cout << "John's birthday is June 17.\n";
break;
default :
cout << "Invalid selection\n";
}
return 0;
}

输出:

1
2
2
Sharon's birthday is April 22.

7.

代码测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>

using namespace std;

enum Roster {Tom, Sharon, Bill, Teresa, John};

int main()
{
//两种定义方法
Roster student;
enum Roster student1;

student = Sharon;
if (student == Sharon)
cout << "k1" << endl;//k1
student1 = Sharon;
if (student1 == Sharon)
cout << "k1.1" << endl;//k1.1

int Tom = 12;//可以定义同名的变量,使用情况如下:
//1.直接使用Tom赋值
//student = Tom;//erroe:invalid conversion from 'int' to 'Roster'
//2.加上域运算符可以正常使用
student = Roster::Tom;

if (student == Tom)//优先使用全局的Tom,即12
cout << "k2" << endl;//不打印
if (student == Roster::Tom)
cout << "k2" << endl;//k2
int awaw = 2;
student = Bill;
if (student == awaw)//但是可以使用整型来进行判断
cout << "k3" << endl;//k3
cout << "Hello world!" << endl;
return 0;
}

/*输出
k1
k1.1
k2
k3
Hello world!
*/

原文地址:https://baike.baidu.com/item/ENUM/10934073?fr=aladdin

http://c.biancheng.net/view/1367.html