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值
相关推荐
octopus_c1 小时前
数据结构:堆(Heap)详解
c语言·数据结构·算法
YH55269847 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
遥感知识服务8 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶8 小时前
1-13-TimSort
算法
ZJU_统一阿萨姆8 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
叩码以求索10 小时前
浅谈:前序遍历反转法求解N叉树的后序遍历
算法
北风toto12 小时前
中缀、前缀、后缀表达式
算法·软件设计师
听取WA声一片(无恶意)12 小时前
CSP-J/CSP-S 深度优先搜索(DFS)完全讲义
c++·算法·深度优先
码流怪侠12 小时前
2026年8月GitHub热榜深度拆解:Agent Skills席卷开源圈,一个“技能包“收割5万星
算法·程序员·github
hold?fish:palm12 小时前
30 两两交换链表中的节点
数据结构·算法·链表