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;//有些编译器可以通过,但最好不要

在这里插入图片描述

相关文章
|
8月前
|
编译器 C++
C++初阶(十七)模板进阶
C++初阶(十七)模板进阶
61 0
《C++避坑神器·十二》函数返回值不能被赋值问题
《C++避坑神器·十二》函数返回值不能被赋值问题
105 0
|
存储 算法 C语言
20230806算法题(C语言)(适合专升本的同学和入门的小白)
20230806算法题(C语言)(适合专升本的同学和入门的小白)
|
存储 编译器 Linux
C++初阶之一篇文章让你掌握string类(了解和使用)(下)
3.5 string类对象的修改器(Modifiers) 函数名称 功能说明 operator+= 用于字符串的连接 append 在字符串末尾添加字符或字符序列
|
存储 C++ 索引
C++初阶之一篇文章让你掌握string类(模拟实现)(下)
7.8 string类insert函数、append函数、push_back函数、+=重载 insert函数 insert的模拟实现主要实现字符和字符串插入两种
|
存储 C++ 容器
C++初阶之一篇文章教会你list(理解和使用)(中)
3. max_size() max_size() 是 std::list 容器的一个成员函数,用于返回容器可能容纳的最大元素数量,通常受到系统内存限制的影响。它返回一个无符号整数类型,表示容器的最大大小。函数签名如下:
|
存储 缓存 安全
C++初阶之一篇文章教会你list(理解和使用)(上)
在C++标准库中,std::list 是一个双向链表容器,用于存储一系列元素。与 std::vector 和 std::deque 等容器不同,std::list 使用链表的数据结构来组织元素,因此在某些操作上具有独特的优势和性能特点。以下是关于 std::list 的详细介绍:
|
C++ 容器
C++初阶之一篇文章教会你list(理解和使用)(下)
11. swap void swap(list& x); 是 std::list 容器的成员函数,用于交换当前列表与另一个列表 x 的内容。
|
存储 C语言
【简单地过一遍C语言基础部分】所有知识点,点到为止!(仅一万多字)(三)
就在前几天,C语言入门到进阶部分的专栏——《维生素C语言》终于完成了。全文共计十八个章节并附带三张笔试练习篇,美中不足的是,第一章和第二章是以截图形式展现的。由于本人一开始是在有道云笔记上写的初稿,当时想方便省事(有道云排版个人感觉确实比较美观)就直接以截图的形式完成了第一章和第二章。本人考虑到因为是截图,不能复制文中出现的代码,不方便读者进行复制粘贴,所以我打算重新写一下第一章和第一章的内容,并且重新进行了排版。
120 0
【简单地过一遍C语言基础部分】所有知识点,点到为止!(仅一万多字)(三)
|
编译器 C语言
【简单地过一遍C语言基础部分】所有知识点,点到为止!(仅一万多字)(一)
就在前几天,C语言入门到进阶部分的专栏——《维生素C语言》终于完成了。全文共计十八个章节并附带三张笔试练习篇,美中不足的是,第一章和第二章是以截图形式展现的。由于本人一开始是在有道云笔记上写的初稿,当时想方便省事(有道云排版个人感觉确实比较美观)就直接以截图的形式完成了第一章和第二章。本人考虑到因为是截图,不能复制文中出现的代码,不方便读者进行复制粘贴,所以我打算重新写一下第一章和第一章的内容,并且重新进行了排版。
131 0
【简单地过一遍C语言基础部分】所有知识点,点到为止!(仅一万多字)(一)

热门文章

最新文章