• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言枚举类型(C语言enum用法)详解

C语言枚举类型(C语言enum用法)详解

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2022-04-30

匿名通过本文主要向大家介绍了等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等。

以每周七天为例,我们可以使用#define命令来给每天指定一个名字:
#include <stdio.h>#define Mon 1#define Tues 2#define Wed 3#define Thurs 4#define Fri 5#define Sat 6#define Sun 7int main(){    int day;    scanf("%d", &day);    switch(day){        case Mon: puts("Monday"); break;        case Tues: puts("Tuesday"); break;        case Wed: puts("Wednesday"); break;        case Thurs: puts("Thursday"); break;        case Fri: puts("Friday"); break;        case Sat: puts("Saturday"); break;        case Sun: puts("Sunday"); break;        default: puts("Error!");    }    return 0;}
运行结果:
5↙
Friday

#define命令虽然能解决问题,但也带来了不小的副作用,导致宏名过多,代码松散,看起来总有点不舒服。C语言提供了一种枚举(Enum)类型,能够列出所有可能的取值,并给它们取一个名字。

枚举类型的定义形式为:

enum typeName{ valueName1, valueName2, valueName3, ...... };

enum是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途;typeName是枚举类型的名字;valueName1, valueName2, valueName3, ......是每个值对应的名字的列表。注意最后的;不能少。

例如,列出一个星期有几天:
enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues ...... Sun 对应的值分别为 0、1 ...... 6。

我们也可以给每个名字都指定一个值:
enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };
更为简单的方法是只给第一个名字指定值:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
这样枚举值就从 1 开始递增,跟上面的写法是等效的。

枚举是一种类型,通过它可以定义枚举变量:
enum week a, b, c;
也可以在定义枚举类型的同时定义变量:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;
有了枚举变量,就可以把列表中的值赋给它:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };enum week a = Mon, b = Wed, c = Sat;
或者:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;
【示例】判断用户输入的是星期几。
#include <stdio.h>int main(){    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;    scanf("%d", &day);    switch(day){        case Mon: puts("Monday"); break;        case Tues: puts("Tuesday"); break;        case Wed: puts("Wednesday"); break;        case Thurs: puts("Thursday"); break;        case Fri: puts("Friday"); break;        case Sat: puts("Saturday"); break;        case Sun: puts("Sunday"); break;        default: puts("Error!");    }    return 0;}
运行结果:
4↙
Thursday

需要注意的两点是:
1) 枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。

2) Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。

枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。

对于上面的代码,在编译的某个时刻会变成类似下面的样子:
#include <stdio.h>int main(){    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;    scanf("%d", &day);    switch(day){        case 1: puts("Monday"); break;        case 2: puts("Tuesday"); break;        case 3: puts("Wednesday"); break;        case 4: puts("Thursday"); break;        case 5: puts("Friday"); break;        case 6: puts("Saturday"); break;        case 7: puts("Sunday"); break;        default: puts("Error!");    }    return 0;}
Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用&取得它们的地址。这就是枚举的本质。
关于程序在内存中的分区以及各个分区的作用,我们将在《C语言内存精讲》专题中的《Linux下C语言程序的内存布局(内存模型)》一节中详细讲解。
我们在《C语言switch case语句》一节中讲过,case 关键字后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量,正是由于 Mon、Tues、Wed 这些名字最终会被替换成一个整数,所以它们才能放在 case 后面。

枚举类型变量需要存放的是一个整数,我猜测它的长度和 int 应该相同,下面来验证一下:
#include <stdio.h>int main(){    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day = Mon;    printf("%d, %d, %d, %d, %d\n", sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed), sizeof(int) );    return 0;}
运行结果:
4, 4, 4, 4, 4
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28Swift编程中的泛型解析
  • 2017-05-28关于统计数字问题的算法
  • 2017-05-28解析C++中的虚拟函数及其静态类型和动态类型
  • 2017-05-28浅谈c和c++的某些小区别
  • 2017-05-28C++运算符重载规则详解
  • 2017-05-28C++中回调函数(CallBack)的用法分析
  • 2017-05-28《C++ primer plus》读书笔记(三)
  • 2017-05-28c语言实现把文件中数据读取并存到数组中
  • 2017-05-28C++ 中使用lambda代替 unique_ptr 的Deleter的方法
  • 2017-05-28C语言 strftime 格式化显示日期时间的实现

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 高效实现整型数字转字符串int2str的方法
    • linux之awk命令的用法
    • C++语言编写写日志类
    • C语言递归操作用法总结
    • C++构造函数初始化顺序详解
    • C语言typedef与复杂函数声明问题的深入解析
    • 解析C++编程中异常相关的堆栈展开和throw()异常规范
    • C++画正弦线实例代码
    • VC程序设计小技巧20例
    • 完全掌握C++编程中构造函数使用的超级学习教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有