C · 进阶 | 枚举?看一遍就够了

简介: 结构体、枚举、联合体都是自定义类型

在这里插入图片描述
啊我摔倒了..有没有人扶我起来学习....


@TOC


前言

结构体、枚举、联合体都是自定义类型,结构体主要知识点结构体内存对齐可参考《C | 结构体内存对齐》


枚举

1. 枚举的定义

  • 大括号内叫做枚举的可能取值,而每一个可能的取值都是常量
enum Color
{
    RED,
    GREEN,
    BLUE
};
  • 如果把可能取值都打印出来呢?
int main()
{
    printf("%d\n", RED);
    printf("%d\n", GREEN);
    printf("%d\n", BLUE);
    return 0;
}
打印结果: 在这里插入图片描述可以看到,如果直接打印,默认是从0开始依次增加
  • 既然枚举的可能取值都是常量,说明不能对它进行赋值,但若是创建枚举的时候初始化呢?
enum Color
{
    RED ,
    GREEN = 10,
    BLUE 
};
打印结果: 在这里插入图片描述发现确实可以,并且会影响后面没初始化的值

2. 枚举的内存大小

  • 既然枚举的可能取值类似于整型常量,那三个变量的话就是12字节?
int main()
{
    printf("%d\n", sizeof(enum Color));
    return 0;
}
打印结果: 在这里插入图片描述可以看到,既然是可能取值,每次只可能取一个值,所以是 4个字节。==但是!这个跟具体编译器有关,望铁汁们稍加注意==

3. 枚举的优势

  • 看完以上内容,铁汁们可能会觉得枚举根本没鸟用嘛!别急,咱们细细研究一下~
  • 我们可以使用#define定义常量,为什么非要使用枚举?~来对比一下
enum Color
{
    RED = 5,
    GREEN = 7,
    BLUE = 10
};

#define RED 5
#define GREEN 7
#define BLUE 10
  • 看起来是这么回事没错,但是,我们要知道,#define是预处理指令,也就是说,#define定义的常量在预处理阶段就已经进行了替换,所有的RED就已经替换成了5,那么等我们调试的时候要是出现了问题,就不好发现了

在这里插入图片描述

  • 枚举的优点总结:

    1. 增加代码的可读性和可维护性
    2. #define定义的标识符比较,枚举拥有类型,更加严谨
    3. 防止了命名污染(封装)
    4. 便于调试
    5. 使用方便,一次可以定义多个常量

4. 枚举需要注意的地方

  • 虽然枚举的可能取值是常量,类似于整形常量,并且某些编译器下还可以混合起来计算,但是要注意避免这种情况
  • 只能拿枚举常量给枚举变量赋值,这样才不会出现类型的差异
    enum Color clr = GREEN;//可以
    enum Color clr = 5;//有些编译器可以通过,但最好不要

在这里插入图片描述

相关文章
|
2月前
|
算法 Java C语言
【c语言基础题】— —第一版,可当作日常练习和期末复习,有奇效哟!
【c语言基础题】— —第一版,可当作日常练习和期末复习,有奇效哟!
89 0
|
9月前
|
存储 算法 C语言
20230806算法题(C语言)(适合专升本的同学和入门的小白)
20230806算法题(C语言)(适合专升本的同学和入门的小白)
|
9月前
|
存储 缓存 安全
C++初阶之一篇文章教会你list(理解和使用)(上)
在C++标准库中,std::list 是一个双向链表容器,用于存储一系列元素。与 std::vector 和 std::deque 等容器不同,std::list 使用链表的数据结构来组织元素,因此在某些操作上具有独特的优势和性能特点。以下是关于 std::list 的详细介绍:
|
9月前
|
存储 C++ 容器
C++初阶之一篇文章教会你list(理解和使用)(中)
3. max_size() max_size() 是 std::list 容器的一个成员函数,用于返回容器可能容纳的最大元素数量,通常受到系统内存限制的影响。它返回一个无符号整数类型,表示容器的最大大小。函数签名如下:
|
9月前
|
C++ 容器
C++初阶之一篇文章教会你list(理解和使用)(下)
11. swap void swap(list& x); 是 std::list 容器的成员函数,用于交换当前列表与另一个列表 x 的内容。
|
存储 缓存 自然语言处理
【JAVA期末复习资源】包含重点知识、踩坑知识,期末复习看这一份就够了
【JAVA期末复习资源】包含重点知识、踩坑知识,期末复习看这一份就够了
248 0
【JAVA期末复习资源】包含重点知识、踩坑知识,期末复习看这一份就够了
|
存储 前端开发 JavaScript
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符②
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符②
76 0
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符②
|
前端开发 C语言
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符①
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符①
56 0
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符①
|
前端开发
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符③
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符③
52 0
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符③
|
前端开发 JavaScript C语言
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符④
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符④
72 0
带你读书之“红宝书”:第三章 语法基础(中)之 3.5操作符④