C语言枚举类型

枚举类型(Enumeration Type)是C语言中的一种用户自定义数据类型,它允许我们定义一组具有离散值的常量,每个常量都有一个名称和一个关联的整数值。

定义

复制代码
enum 枚举类型名 {
    枚举常量1,
    枚举常量2,
    枚举常量3,
    // ...更多枚举常量
};

声明

cpp 复制代码
enum Weekday today;  // 声明一个Weekday类型的变量today

enum Weekday {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
} today, tomorrow;

默认,枚举常量的值从0开始,依次递增。在上面的例子中:

  • MONDAY 的值为 0

  • TUESDAY 的值为 1

  • WEDNESDAY 的值为 2

也可以自己写:

cpp 复制代码
enum Weekday {
    MONDAY = 1,    // 从1开始
    TUESDAY,       // 自动为2
    WEDNESDAY,     // 自动为3
    THURSDAY,      // 自动为4
    FRIDAY,        // 自动为5
    SATURDAY,      // 自动为6
    SUNDAY         // 自动为7
};



enum Status {
    START = 0,
    RUNNING = 5,
    PAUSED = 10,
    STOPPED = 15
};

基本使用

cpp 复制代码
#include <stdio.h>

enum Weekday {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

int main() {
    enum Weekday today = WEDNESDAY;
    
    printf("今天是星期%d\n", today + 1);  // 输出:今天是星期3
    
    // 使用枚举常量进行比较
    if (today == WEDNESDAY) {
        printf("今天是星期三\n");
    }
    
    // 枚举变量可以赋值为整数
    today = 6;  // 相当于 today = SUNDAY
    
    // 枚举变量可以参与算术运算
    enum Weekday tomorrow = (today + 1) % 7;
    
    return 0;
}

枚举类型特别适合与switch语句一起使用:

cpp 复制代码
#include <stdio.h>

enum Weekday {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

int main() {
    enum Weekday today = WEDNESDAY;
    
    switch (today) {
        case MONDAY:
            printf("今天是星期一\n");
            break;
        case TUESDAY:
            printf("今天是星期二\n");
            break;
        case WEDNESDAY:
            printf("今天是星期三\n");
            break;
        case THURSDAY:
            printf("今天是星期四\n");
            break;
        case FRIDAY:
            printf("今天是星期五\n");
            break;
        case SATURDAY:
        case SUNDAY:
            printf("今天是周末\n");
            break;
        default:
            printf("无效的星期\n");
    }
    
    return 0;
}

枚举类型的大小

cpp 复制代码
int main() {
    printf("枚举类型的大小: %zu字节\n", sizeof(enum Weekday));  // 通常输出4(在大多数系统上)
    
    return 0;
}

匿名枚举

cpp 复制代码
只枚举常量

#include <stdio.h>

int main() {
    // 匿名枚举
    enum {
        RED,
        GREEN,
        BLUE
    };
    
    int color = GREEN;
    printf("选择的颜色代码: %d\n", color);  // 输出:选择的颜色代码: 1
    
    return 0;
}

枚举常量经常用于表示位标志(bit flags),这在需要表示多个选项的组合时非常有用:

cpp 复制代码
#include <stdio.h>

// 文件权限标志
enum FilePermission {
    READ = 1,           // 二进制: 001
    WRITE = 2,          // 二进制: 010
    EXECUTE = 4         // 二进制: 100
};

int main() {
    // 组合权限
    int permissions = READ | WRITE;  // 二进制: 011 (值为3)
    
    // 检查是否有读权限
    if (permissions & READ) {
        printf("有读权限\n");
    }
    
    // 检查是否有写权限
    if (permissions & WRITE) {
        printf("有写权限\n");
    }
    
    // 检查是否有执行权限
    if (permissions & EXECUTE) {
        printf("有执行权限\n");
    } else {
        printf("没有执行权限\n");
    }
    
    // 添加执行权限
    permissions |= EXECUTE;  // 现在permissions的值为7 (二进制: 111)
    
    // 移除写权限
    permissions &= ~WRITE;   // 现在permissions的值为5 (二进制: 101)
    
    return 0;
}

枚举常量的作用域与变量的作用域规则相同。在全局定义的枚举常量具有全局作用域,在函数内定义的枚举常量具有局部作用域。

枚举常量的唯一性

cpp 复制代码
enum Color { RED, GREEN, BLUE };
enum Traffic { RED, YELLOW, GREEN };  // 错误:RED和GREEN已经在前面定义过

类型安全

cpp 复制代码
enum Weekday day = 42;  // 合法,但42不是有效的Weekday值
相关推荐
wuguan_15 小时前
C#递推算法
算法·c#·递推算法
多米Domi01115 小时前
0x3f第14天 最长公共子序列
算法·深度优先
spssau15 小时前
正交试验设计全解析:从正交表生成到极差与方差分析
数据库·算法·机器学习
minhuan15 小时前
大模型应用:不减性能只减负担:大模型稀疏化技术全景与实践.36
大数据·人工智能·算法
爱学大树锯15 小时前
592 · 查找和替换模式
算法
爱学大树锯15 小时前
775 · 回文对
算法
girl-072616 小时前
2025.12.26代码分析
数据结构·算法
大罗辑16 小时前
2026软考备考刷题:软件设计师经典100题(5)含详细解析
算法·软考·软件设计师·2026软考·软设备考
咕噜企业分发小米16 小时前
阿里云Milvus支持哪些向量检索算法?
算法·机器学习·milvus
蒙奇D索大16 小时前
【数据结构】排序算法精讲|折半插入排序全解:高效优化、性能对比、实战剖析
数据结构·学习·考研·算法·排序算法·改行学it