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值
相关推荐
liu****4 小时前
20.预处理详解
c语言·开发语言·数据结构·c++·算法
努力学算法的蒟蒻4 小时前
day26(12.6)——leetcode面试经典150
算法·leetcode·面试
代码游侠4 小时前
数据结构——哈希表
数据结构·笔记·学习·算法·哈希算法·散列表
FY_20185 小时前
Stable Baselines3中调度函数转换器get_schedule_fn 函数
开发语言·人工智能·python·算法
CoderYanger5 小时前
动态规划算法-子数组、子串系列(数组中连续的一段):26.环绕字符串中唯一的子字符串
java·算法·leetcode·动态规划·1024程序员节
Jane-6667775 小时前
C语言——表达式、语句、函数
c语言·开发语言·算法
Tony_yitao5 小时前
12.华为OD机试 - N个选手比赛前三名、比赛(Java 双机位A卷 100分)
java·算法·华为od·algorithm
小龙报5 小时前
【算法通关指南:数据结构与算法篇】树形结构遍历指南:DFS 递归深搜与 BFS 队列广搜实战解析
c语言·数据结构·c++·算法·链表·深度优先·visual studio
业精于勤的牙5 小时前
浅谈:快递物流与算法的相关性(六)
算法