枚举类型的定义

本文介绍了C/C++中枚举类型的定义,包括指定和不指定元素整型常量值的情况。阐述了枚举类型变量的三种定义方法,以及枚举变量的赋值和关系运算规则。还给出了两个示例,一个是颜色号转换为颜色枚举量,另一个是输出三种颜色的全排列结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在程序设计中,有时会用到由若干个有限数据元素组成的集合,如一周内的星期一到星期日七个数据元素组成的集合,由三种颜色红、黄、绿组成的集合,一个工作班组内十个职工组成的集合等等,程序中某个变量取值仅限于集合中的元素。此时,可将这些数据集合定义为枚举类型。因此,枚举类型是某类数据可能取值的集合,如一周内星期可能取值的集合为:
  { Sun,Mon,Tue,Wed,Thu,Fri,Sat}
  该集合可定义为描述星期的枚举类型,该枚举类型共有七个元素,因而用枚举类型定义的枚举变量只能取集合中的某一元素值。由于枚举类型是导出数据类型,因此,必须先定义枚举类型,然后再用枚举类型定义枚举型变量。

 

  enum <枚举类型名>
  { <枚举元素表> };
  其中:关键词enum表示定义的是枚举类型,枚举类型名由标识符组成,而枚举元素表由枚举元素或枚举常量组成。例如:
  enum weekdays
  { Sun,Mon,Tue,Wed,Thu,Fri,Sat };
  定义了一个名为 weekdays的枚举类型,它包含七个元素:Sun、Mon、Tue、Wed、Thu、Fri、Sat。在编译器编译程序时,给枚举类型中的每一个元素指定一个整型常量值(也称为序号值)。若枚举类型定义中没有指定元素的整型常量值,则整型常量值从0开始依次递增,因此,weekdays枚举类型的七个元素Sun、Mon、Tue、Wed、Thu、Fri、Sat对应的整型常量值分别为0、1、2、3、4、5、6。
  注意:在定义枚举类型时,也可指定元素对应的整型常量值。例如,描述逻辑值集合{TRUE、FALSE}的枚举类型boolean可定义如下:
  enum boolean
  { TRUE=1 ,FALSE=0 };
  该定义规定:TRUE的值为1,而FALSE的值为0。
  而描述颜色集合{red,blue,green,black,white,yellow}的枚举类型colors可定义如下:
  enum colors
  {red=5,blue=1,green,black,white,yellow};
  该定义规定red为5 ,blue为1,其后元素值从2 开始递增加1。green、black、white、yellow的值依次为2、3、4、5。此时,整数5将用于表示二种颜色red与yellow。通常两个不同元素取相同的整数值是没有意义的。
  枚举类型的定义只是定义了一个新的数据类型,只有用枚举类型定义枚举变量才能使用这种数据类型。

  8.1.2枚举类型变量的定义

  定义枚举类型变量有三种方法,即:先定义类型后定义变量,定义类型的同时定义变量,直接定义变量,现介绍如下:
  1.先定义类型后定义变量
  格式: <枚举类型名> <变量1>〔,<变量2>,…,<变量n>〕;
  例如:enum colors
  {red=5,blue=1,green,black,white,yellow};
  colors c1,c2;
  c1、c2 为colors类型的枚举变量。

  2.定义类型的同时定义变量

  格式:enum <枚举类型名>
  { <枚举元素表> } <变量1>〔,<变量2>,…,<变量n>〕;
  例如:enum colors
  {red=5,blue=1,green,black,white,yellow}c1,c2;

  3.直接定义枚举变量

  格式:enum
  { <枚举元素表> } <变量1>〔,<变量2>,…,<变量n>〕;
  例如:enum
  {red=5,blue=1,green,black,white,yellow} c1=red,c2=blue;
  由上例可以看出,定义枚举变量时,可对变量进行初始化赋值,c1的初始值为red,c2的初始值为blue。
 

  8.1.3 枚举类型变量的引用

  对枚举类型变量只能使用2类运算:赋值运算与关系运算。
  1.赋值运算
  C++中规定,枚举类型的元素可直接赋给枚举变量,且同类型枚举变量之间可以相互赋值。如:enum weekdays //定义星期日到星期六为枚举类型weekdays
{ Sun,Mon,Tue,Wed,Thu,Fri,Sat };
 void main ( void )
 { weekdays day1,day2; //定义两个枚举型变量day1、day2
  day1=Sun; //将元素Sun赋给枚举变量day1
  day2=day1; //枚举变量day1赋给day2
  cout<<day1<<endl; //输出day1的值,即Sun的序号0
 }
  该例定义了两个类型为weekdays的枚举类型变量day1与day2,这两个枚举型变量只能取集合 { Sun,Mon,Tue,Wed,Thu,Fri,Sat }中的一个元素,可用赋值运算符将元素Sun赋给day1。枚举变量day1的值可赋给同类枚举变量day2。注意:
  (1)不能用键盘通过"cin>>"向枚举变量输入元素值,例如:cin>>day1是错误的。因此,枚举变量的值只能通过初始化或赋值运算符输入。
  (2)可用"cout<<"输出枚举变量,但输出的是元素对应的序号值,而不是元素值。例如:cout<<day1; 用cout输出day1中元素Sun对应的序号值0,而不是元素Sun。

  2.关系运算
  枚举变量可与元素常量进行关系比较运算,同类枚举变量之间也可以进行关系比较运算,但枚举变量之间的关系运算比较是对其序号值进行的。例如:
  day1=Sun; //day1中元素Sun的序号值为0
  day2=Mon; //day2中元素Mon的序号值为1
  if (day2>day1) day2=day1; //day2>day1的比较就是序号值关系式:1>0的比较
  if (day1>Sat) da1=Sat; //day1>Sat的比较就是序号值关系式:0>6的比较
  day2与day1的比较,实际上是其元素Mon与Sun序号值1与0的比较,由于1>0成立,所以day2>day1条件为真,day2=day1=Sun。同样由于day1中元素Sun的序号值0小于Sat的序号值6,所以day1>Sat条件为假,day1的值不变。
  

  【例8.1】先定义描述6种颜色的枚举类型colors,然后再用该枚举类型定义枚举数组,任意输入6个颜色号,转换成对应的颜色枚举量后输入到枚举数组中,最后输出枚举数组中对应的颜色。
 # include <iostream.h>
 # include <stdlib.h> //使用exit(0)函数时必须包含stdlib.h头文件
 enum colors //定义有6种颜色元素的枚举类型colors
 { red, blue,green,black,white,yellow };
 void main( void)
 { colors color[6]; //定义枚举类型数组color[6]
  int j,n;
  cout<<"0:red,1:blue,2:green,3:black,4:white,5:yellow"<<endl;
  cout<<" 请输入6个颜色号:";
  for (j=0;j<6;j++)
   { cin >> n; //输入颜色号
    if (n<0 || n>5 )
    { cout << "输入颜色值出错,请重新输入!";
     exit(0);
     }
    else
   switch(n) //将颜色号转换成颜色元素存入数组
    { case 0 : color[j]=red; break;
     case 1 : color[j]=blue; break;
     case 2 : color[j]=green ; break;
     case 3 : color[j]=black; break;
     case 4 : color[j]=white; break;
     case 5 : color[j]=yellow; break;
    }
     }
   for (j=0 ;j<6;j++) //循环6次,输出数组元素对应的颜色
     { switch (color[j])
      { case red : cout <<"red" ; break;
       case blue: cout<<"blue" ; break;
       case green : cout <<"green" ; break;
       case black : cout<<"black" ; break;
       case white : cout <<"white" ; break;
       case yellow :cout <<"yellow" ; break;
      }
     cout<<'/t';
     }
    cout<<'/n';
  }
  程序执行时,屏幕提示:
  0:red,1:blue,2:green,3:black,4:white,5:yellow
  请输入6个颜色号:0 1 2 3 4 5
  屏幕输出:red blue green black white yellow
  由于无法通过键盘直接向枚举变量输入枚举元素值,所以程序中只能先输入枚举元素的序号值,然后用开关语句将序号值转换为元素值,并将元素值赋给枚举数组元素。同样,由于用cout无法输出枚举数组中元素值,所以在输出时,只能用开关语句判断输出哪一个元素,然后用cout<<"元素"方式输出对应的元素值。

  【例8.2】定义一个描述三种颜色的枚举类型{red、blue、green},输出这三种颜色的全部排列结果。
 解:这是三种颜色的全排列问题,用穷举法即可输出三种颜色的全部27种排列结果。
 # include <iostream.h>
 enum colors
 {red , blue,green};
 void show(colors color)
 { switch(color)
  { case red : cout<<"red";break;
  case blue : cout<<"blue";break;
  case green : cout<<"green";break;
  }
  cout<<'/t';
 }
 void main(void)
 { colors col1,col2,col3;
  for(col1=red ;col1<=green;col1=colors(int (col1) +1))
  for(col2=red ;col2<=green;col2=colors(int (col2) +1))
  for(col3=red ;col3<=green;col3=colors(int (col3) +1))
  { show(col1);
   show(col2);
   show(col3);
   cout<<'/n';
  }
 }
  程序通过三重循环穷举出三种颜色所有的组合。for循环语句中,用枚举变量col1为循环变量,col1取值从red开始到green为止,循环变量的自加操作是通过表达式col1=colors(int (col1) +1) 来实现的,表达式中,先将col1转换成整数,然后加1,再转换成colors类型的枚举值赋给col1变量。

<think>嗯,用户现在问的是C语言中的枚举类型定义方式。之前他们问过关于如何定义string类型的问题,现在可能是在继续学习C语言的基础数据类型,特别是枚举。我需要先回顾一下枚举的基本概念和语法,确保自己理解正确。 首先,用户可能已经知道C语言没有原生的字符串类型,之前教过他们用char数组或指针来模拟。现在转向枚举,应该先解释枚举的作用,为什么需要它,然后具体说明如何定义和使用。 我需要考虑用户可能的背景。可能是一个刚开始学习C语言的新手,对复合数据类型还不熟悉。需要从基础讲起,结构清晰,步骤明确,避免使用过于专业的术语,或者如果用了术语,要及时解释。 用户的问题比较直接,但可能需要示例来帮助理解。比如,枚举的定义语法,枚举常量的赋值,以及如何使用枚举变量。同时,要提到枚举的优点,比如增加代码可读性,类型检查等。 另外,用户可能对枚举和宏定义的区别有疑问,虽然问题中没有提到,但或许可以简要比较,帮助用户理解为何选择枚举而不是宏。不过,如果用户没有问,可能不需要展开,避免信息过载。 还要注意枚举的一些细节,比如默认的常量值是从0开始递增的,但也可以手动赋值。同时,枚举在C语言中的实现方式,可能只是整数常量,但编译器会进行类型检查,这样在编译时能捕捉一些错误。 需要给出具体的例子,比如定义一个颜色的枚举,或者星期的枚举,然后展示如何声明变量和使用。同时,指出常见错误,比如直接赋整数值是否需要强制类型转换,不同编译器的处理方式是否有差异。 最后,总结枚举的使用场景和好处,确保用户明白在什么情况下使用枚举会更合适,比如状态码、选项标志等,提高代码的可维护性。 可能还需要提到C语言中枚举的局限性,比如作用域问题(枚举常量是全局的),C11标准中的改进,比如强类型枚举,但C语言本身支持的可能有限,主要是C++中有更强的枚举类型,但用户问的是C,所以需要准确。 检查是否有常见的误区,比如枚举变量的大小,是否和int相同,或者是否可移植。不过这部分可能属于进阶内容,用户作为新手可能暂时不需要,但可以简要提及。 总之,回答需要结构清晰,分步骤讲解定义方式,结合示例,注意事项,以及实际应用场景,帮助用户全面理解枚举类型在C语言中的定义和使用。</think>在C语言中,枚举类型(`enum`)用于定义一组命名的整数常量,使代码更易读且更具语义。以下是枚举类型定义方式和使用方法: --- ### **1. 基本定义语法** 枚举通过关键字 `enum` 定义,基本格式为: ```c enum 枚举名 { 标识符1, // 默认值从0开始 标识符2, // 值为前一个标识符+1 ... 标识符N }; ``` #### **示例**:定义星期枚举 ```c enum Weekday { MON, // 0 TUE, // 1 WED, // 2 THU, // 3 FRI, // 4 SAT, // 5 SUN // 6 }; ``` --- ### **2. 显式赋值** 可以为枚举常量显式指定值,后续未赋值的常量自动递增: ```c enum StatusCode { OK = 200, // 200 BAD_REQUEST = 400, // 400 NOT_FOUND = 404, // 404 SERVER_ERROR // 405(自动递增) }; ``` --- ### **3. 声明枚举变量** 定义枚举类型后,可声明该类型的变量: ```c enum Weekday today = WED; // today的值为2 ``` --- ### **4. 结合 `typedef` 简化** 使用 `typedef` 可为枚举类型定义别名,避免重复写 `enum`: ```c typedef enum { RED, // 0 GREEN, // 1 BLUE // 2 } Color; Color c = GREEN; // 直接使用别名声明变量 ``` --- ### **5. 完整示例** ```c #include <stdio.h> // 定义枚举类型 typedef enum { OFF, // 0 LOW = 5, // 5 MEDIUM, // 6 HIGH // 7 } FanSpeed; int main() { FanSpeed speed = MEDIUM; if (speed == MEDIUM) { printf("Current speed: %d\n", speed); // 输出: 6 } return 0; } ``` --- ### **6. 关键特性** 1. **本质是整数**:枚举常量在内存中以 `int` 类型存储。 2. **作用域规则**: - 枚举常量是全局的,需注意命名冲突(如两个枚举中都有 `RED`)。 3. **类型安全**: - C语言中枚举变量可隐式转换为整数,但直接赋整数值需强制类型转换: ```c FanSpeed speed = (FanSpeed)6; // 强制转换 ``` --- ### **7. 枚举 vs. 宏定义** | **特性** | **枚举** | **宏定义(`#define`)** | |----------------|-----------------------------------|-------------------------------| | 类型关联 | 常量属于同一枚举类型 | 独立的整数替换 | | 可读性 | 高(集中定义,有语义) | 低(分散定义) | | 调试信息 | 保留标识符名称 | 编译后替换为数字,无名称信息 | | 作用域 | 全局 | 全局 | --- ### **8. 适用场景** - 表示有限的状态(如开关状态、错误码)。 - 替代魔数(magic number),增强代码可维护性。 - 需要类型检查的场景(尽管C语言中较弱,但比宏更规范)。 --- ### **9. 注意事项** - 避免重复的枚举常量名(如同时定义两个 `enum` 包含 `SUCCESS`)。 - C11标准支持强类型枚举(需编译器支持),但大多数场景仍依赖传统定义方式。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值