• C:枚举的优缺


    C语言可以通过两种方式定义常量:

    1.#define宏定义

    2.enum枚举定义

    使用#define宏定义的缺点是,其属于预编译阶段常量,其名字会被预编译器替换为数值,这样在编译阶段,其名字已经不会再出现。

    只用enum枚举定义,其名字在编译阶段依然是可见的。

    定义枚举常量的方式为:

    enum Color{red, green, blue};

    其中枚举类型名Color是可选的。

    没有为枚举常量设置值时,枚举类型中的第一个枚举常量的值为0,第二个为1,以此类推。

    如果指定了枚举常量的值,那么后续枚举常量的值依次加1.

    1. #include
    2. int main()
    3. {
    4. enum Color{red, yellow, green=5, blue, white=1 };
    5. printf("%d %d %d %d %d\n", red, yellow, green, blue, white);
    6. return 0;
    7. }

    运行程序输出:

    0 1 5 6 1

    red,由于没有被设置值,因此默认值为0

    yellow,基于red加1,值为1

    green,被指定了值,值为5

    blue,基于green加1,值为6

    white,被指定了值,值为1

    需要注意的是,枚举常量一旦被初始化后,其值是不能被更改的,也正因为如此才被称为枚举常量。

    可以通过如下方式定义枚举变量:

    1. #include
    2. int main()
    3. {
    4. enum Color{red, yellow, green=5, blue, white=1 };
    5. enum Color c1 = green;
    6. enum Color c2 = (Color)9; //不能直接用整数为枚举变量赋值
    7. printf("%d %d\n", c1, c2);
    8. return 0;
    9. }

    运行程序输出:

    5 9

    c1,枚举变量被定义为green,值为5

    c2,枚举变量被定义了一个不存在的枚举值,值为9

    另外需要注意的是,不能在同一个作用域内定义相同名字的枚举常量,即使这些常量位于不同的枚举类型名:

    1. #include
    2. int main()
    3. {
    4. enum Color{red, yellow, green=5, blue, white=8 };
    5. enum Wine{red, white};
    6. printf("%d %d %d\n", red, white, blue);
    7. return 0;
    8. }

    编译错误:
    error: 'red' conflicts with a previous declaration
    error: 'white' conflicts with a previous declaration

    在不同的作用域内定义的枚举常量,相同名字的枚举常量会被掩盖:

    1. #include
    2. enum Color{red, yellow, green=5, blue, white=8 };
    3. int main()
    4. {
    5. enum Wine{red, white};
    6. printf("%d %d %d\n", red, white, blue);
    7. return 0;
    8. }

    运行程序输出:

    0 1 6

    Wine内定义的red和white与Color定义的red和white具有相同的枚举常量名,但由于定义在不同的作用域内,因此Wine的局部作用域red和white掩盖了全局作用域内的Color的red和white

    但是Wine没有定义blue,所以blue的值依然为全局作用域Color定义的枚举常量

    通过以上几个程序可以看到,枚举在使用时有几点异于常规:

    1.枚举的常量值,不需要通过其枚举常量名,可以直接使用

    2.不同的枚举常量可以拥有相同的值

    3.枚举变量可以被赋值一个不存在的枚举常量值

    4.在相同作用域内的枚举名不能重复

    对于这些不足,C++11引入了枚举类,可以更好的使用枚举

    C++(11):枚举类_风静如云的博客-CSDN博客_c++ enum

  • 相关阅读:
    SpringBoot2.x 整合AOP切面编程
    每天一个数据分析题(二百九十三)——数据分析思维
    初识Golang的语法、特性
    docker
    2022年0701 Com.Java.Basis第四课《Java的流程控制语句》
    交叉编译 笔记
    cesium切片底图正常出来但控制台一直报错的方法
    Golang并发-Go优雅的退出程序(同步等待组 sync.WaitGroup)
    C++类与对象深度解析(一):从抽象到实践的全面入门指南
    SmartGit 功能特点介绍 使用老牌Git客户端有哪些优势
  • 原文地址:https://blog.csdn.net/jiemashizhen/article/details/126257469