C语言中enum关键字的实现示例

 更新时间:2024年04月30日 16:44:07   作者:嘻嘻爱编码  
这篇文章主要介绍了C语言中enum关键字的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 C 语言中,有一种基本数据类型叫做枚举类型,它用于定义一组具有离散值的常量,可以让数据更简洁,更易读。枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。本文将介绍 C 语言中的 enum 关键字,它是用来定义枚举类型的。

定义枚举类型

要定义一个枚举类型,需要使用 enum 关键字,后面跟着枚举类型的名称,以及用大括号 {} 括起来的一组枚举常量。每个枚举常量可以用一个标识符来表示,也可以为它们指定一个整数值,如果没有指定,那么默认从 0 开始递增。枚举语法定义格式为:

enum 枚举名 { 枚举元素1, 枚举元素2, ... };

例如,我们可以定义一个表示一周七天的枚举类型,如下:

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };

这里,我们为第一个枚举元素 MON 指定了值为 1,那么后面的枚举元素的值就依次递增,即 TUE 为 2,WED 为 3,依此类推。如果我们不指定任何枚举元素的值,那么默认从 0 开始,即 MON 为 0,TUE 为 1,等等。

我们也可以在定义枚举类型时改变枚举元素的值,例如:

enum SEASON { SPRING, SUMMER=3, AUTUMN, WINTER };

这里,我们为 SUMMER 指定了值为 3,那么后面的枚举元素的值就在前一个元素的基础上加 1,即 AUTUMN 为 4,WINTER 为 5。注意,前面的枚举元素 SPRING 的值仍然是默认的 0。

定义枚举变量

定义了枚举类型后,我们就可以用它来定义枚举变量,用来存储枚举类型的值。我们可以通过以下三种方式来定义枚举变量:

先定义枚举类型,再定义枚举变量

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
enum DAY day;

定义枚举类型的同时定义枚举变量

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;

省略枚举名称,直接定义枚举变量

enum { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;

注意,同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的枚举元素。例如,以下两种声明都是错误的:

// 错误声明一:存在同名的枚举类型
enum WEEKDAY { MON, TUE, WED, THU, FRI };
enum WEEKDAY { SAT, SUN };

// 错误声明二:存在同名的枚举元素
enum WEEKDAY { MON, TUE, WED, THU, FRI };
enum WEEKEND { SAT, SUN, MON };

使用枚举类型的变量

定义了枚举变量后,我们就可以对它进行赋值和使用了。有以下几点需要注意:

对枚举变量赋值时,可以直接使用枚举元素的标识符,也可以使用整数值,但是需要进行类型转换。例如:

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
enum DAY day;
day = WED; // 直接使用枚举元素
day = (enum DAY) 3; // 使用整数值,需要类型转换

使用枚举变量时,可以将它作为整数值来处理,也可以用它来进行条件判断或 switch 语句。例如:

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
enum DAY day;
day = WED;
printf("%d\n", day); // 输出 3
if (day == WED) {
    printf("Today is Wednesday\n"); // 输出 Today is Wednesday
}
switch (day) {
    case MON: printf("Monday\n"); break;
    case TUE: printf("Tuesday\n"); break;
    case WED: printf("Wednesday\n"); break;
    case THU: printf("Thursday\n"); break;
    case FRI: printf("Friday\n"); break;
    case SAT: printf("Saturday\n"); break;
    case SUN: printf("Sunday\n"); break;
    default: printf("Invalid day\n");
}

在 C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。不过在一些特殊的情况下,枚举类型必须连续是可以实现有条件的遍历。例如:

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
enum DAY day;
// 遍历枚举元素
for (day = MON; day <= SUN; day++) {
    printf("枚举元素:%d\n", day);
}

枚举类型的大小

在 C 语言中,枚举类型的大小是由编译器决定的,一般来说,它是按照 int 型或者 unsigned int 型来存储的,所以它的大小通常是 4 个字节。我们可以用 sizeof 运算符来查看枚举类型的大小,例如:

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
enum DAY day;
printf("sizeof enum DAY: %d\n", sizeof(enum DAY)); // 输出 4
printf("sizeof day: %d\n", sizeof(day)); // 输出 4

枚举类型和 #define 宏的区别

最后,我们来看看枚举类型和 #define 宏的区别,它们都可以用来定义一组常量,但是有以下几点不同:

  • #define 宏常量是在预编译阶段进行简单替换,枚举常量则是在编译的时候确定其值。
  • 一般在编译器里,可以调试枚举常量,但是不能调试宏常量。
  • 枚举可以一次定义大量相关的常量,而 #define 宏一次只能定义一个。

总之,枚举类型是 C 语言中的一种有用的数据类型,它可以让我们的程序更加清晰和规范,也可以避免一些魔法数字的出现。

到此这篇关于C语言中enum关键字的实现示例的文章就介绍到这了,更多相关C语言 enum关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • String类的写时拷贝实例

    String类的写时拷贝实例

    下面小编就为大家带来一篇String类的写时拷贝实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C语言实现打印星号图案

    C语言实现打印星号图案

    这篇文章主要介绍了C语言实现打印星号图案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++ 单链表的基本操作(详解)

    C++ 单链表的基本操作(详解)

    下面小编就为大家带来一篇C++ 单链表的基本操作(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++11获取线程返回值的实现代码

    C++11获取线程返回值的实现代码

    这篇文章主要介绍了C++11获取线程返回值的实现代码,需要的朋友可以参考下
    2019-04-04
  • C++引用和指针的区别你知道吗

    C++引用和指针的区别你知道吗

    这篇文章主要为大家介绍了C++引用和指针的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2022-01-01
  • C++11智能指针unique_ptr用法使用场景分析

    C++11智能指针unique_ptr用法使用场景分析

    unique_ptr 是 C++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,即使在异常发生时也可帮助避免资源泄露。这篇文章主要介绍了C++11智能指针unique_ptr用法介绍,需要的朋友可以参考下
    2021-08-08
  • C语言浮点型数据在内存中的存储方式详解

    C语言浮点型数据在内存中的存储方式详解

    任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100,下面这篇文章主要给大家介绍了关于C语言浮点型数据在内存中的存储方式,需要的朋友可以参考下
    2023-03-03
  • C++实现二分法的一些细节(常用场景)

    C++实现二分法的一些细节(常用场景)

    二分法算法思想首先确定有根区间,将区间二等分,通过判断f(x)的符号,逐步将有根区间缩小,直至有根区间足够小,便可求出满足精度要求的近似值
    2021-07-07
  • QT 中文乱码解决汇总(QString与string、char*互转乱码)

    QT 中文乱码解决汇总(QString与string、char*互转乱码)

    在QT中使用中文时,经常会碰到论码问题,本文主要介绍了QT 中文乱码解决汇总(QString与string、char*互转乱码),需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C++重载输入和输出运算符详解

    C++重载输入和输出运算符详解

    在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,本节以前面的 complex 类为例来演示输入输出运算符的重载,需要的朋友可以参考下
    2023-09-09

最新评论