IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言枚举类型和联合体 -> 正文阅读

[C++知识库]C语言枚举类型和联合体

枚举

枚举是C语言中的基本数据类型,就是能把可能的取值一 一举例
比如:性别、星期、月份 这些情况下就可以使用枚举类型

枚举类型的定义

枚举类型的语法形式:

enum 枚举名称
{
  枚举元素1;
  枚举元素2;
  ......
};

枚举类型的定义:

//用枚举举例星期
enum Day//枚举的名称
{
    Mon,
    Tues,
    Wed,     // 枚举星期的所有可能
    Thur,
    Fri,
    Sat,
    Sun
};
  • 以上定义的 enum Day 是枚举类型。
    { }中的内容是枚举类型的可能取值,也叫枚举常量。
    这些可能取值最开始都是默认从0开始,一次递增1

当然在定义的时候也可以赋初值
例如:

enum Sex//性别
{
 MALE = 5,    //男
 FEMALE,  //女
 SECRET  //保密
};
  • 后面的枚举常量是依次递增的,也可以一个一个赋值
enum Sex//性别
{
 MALE = 5,    //男
 FEMALE = 8,  //女
 SECRET= 9  //保密
};

枚举的优点

  1. 代码的简洁性、增加代码的可读性和可维护性
    枚举 enum 和 define 对标
    如果不使用枚举,用 #define定义来为每个可能定义一个别名
#define  MALE
#define FEMALE
#define SECRET

以枚举的方式定义:

enum sex
{ 
    MALE;
    FEMALE;
    SECRET
};
  • 定义性别时看起来还没什么,如果可能性比较多,比如:月份
    那代码就比较多且臃肿,如果使用枚举就会很简洁,而且增加代码的可读性和可维护性

还有就是以枚举类型定义具有一定的意义
可以使用到一些程序中

enum sex
{
    MALE;
    FEMALE;
    SECRET
};
int main()
{
   enum sex a; // 定义枚举变量
   a = MALE;
   printf("%d",a);
   return 0;
}
  1. 和#define定义的标识符比较枚举有类型检查,更加严谨
  2. 防止命名污染
  3. 便于调试
  4. 使用方便,一次可以定义多个常量

枚举的使用

enum Day//用枚举定义星期
{
	Mon=1,         //初始化为1
	Tues,      
	Wed,
	Thur,
	Fri,
	Sat,
	Sun         
};
int main()
{ 
	printf("%d\n", Mon);
	printf("%d\n", Tues);
	printf("%d\n", Wed);
	printf("%d\n", Thur);
	printf("%d\n", Fri);
	printf("%d\n", Sat);
	printf("%d\n", Sun);
	return 0;
}

遍历枚举类型

在C语言中枚举类型是被当做 int 或者 unsigned int 类型来处理的
所以按照 C 语言规范是没有办法遍历枚举类型的。
不过在一些特殊的情况下,枚举类型必须连续是可以实现有条件的遍历。

例如:

#include <stdio.h>
enum DAY{
      MON=1,
      TUE, 
      WED, 
      THU,
      FRI,
      SAT,
      SUN
} day; 
int main()
{
    // 遍历枚举元素
    for (day = MON; day <= SUN; day++)
     {
        printf("枚举元素:%d \n", day);
    }
}
return 0;

关于枚举还有很多使用常景,需要慢慢体会

联合体(共用体)union

联合体也叫共用体,是一种特殊的自定义类型
union 是联合体的关键字
这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合也叫共用体)
联合体语法形式:
书写的格式和结构类似

union ud
{
   int a;
   char b;
};

联合体的体点

联合体的特点:联合体成员都是使用同一块空间,每次使用空间只能选一个成员使用,不能同时使用
比如:a成员使用空间,那 b 成员就不能使用,反之b成员使用空间,那 a 成员就不能使用
例如:
下面测试联合体的大小问题

union ud
{
   int a;
   char b;
};
int main()
{
   union ud u;
   printf("%d\n",sizeof(u));
}

测试结果:
在这里插入图片描述

  • 结果为什么是 4 呢?
    联合的成员是共用同一块内存空间的,这样一个联合变量的大小
    至少是最大成员的大小(因为联 合至少得有能力保存最大的那个成员)

那么联合体的成员 a 和成员 b 的地址是否是一样的呢?

在这里插入图片描述

  • 从图片上可以看出大家的地址都是一样的
  • 因为二者公用一个内存的话,二者指针指向的位置必须是一样的这样才能找到相应的空间。

判断当前计算机的大小端存储

这是之前写过的判断大小端存储的问题,先在我们用联合体来判断

int check_sys()
{
	int i = 1;
	return *(char*)&i;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
}

用联合体来判断大小端存储

int check_sys()
{
	union s
	{
		int i;
		char c;
	}u;
	u.i = 1;
	return u.c;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
}
  • 用联合体创建二个成语,分别是 int ichar cint i 赋值为 1
    小端存储:01 00 00 00
    大端存储:00 00 00 01
    直接返回 u .c,因为成员u.cchar类型,读取的是一个字节
    返回 0 是大端,返回 1 是小端

联合大小的计算

联合体也是存在对齐的

  • 联合的大小至少是最大成员的大小
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

例如:

union Un1
{
char c[5];
int i;
};
int main()
{ 
   printf("%d\n", sizeof(union Un1));
}

  • char c[ 5 ] 有5个元素是占5个空间,char 类型是 1 个字节
  • int i是整型,占 4 个字节
  • 它们的最大的对齐数是 4 ,而char c[5]所占的空间是5个, 5并不是4 的倍数
    那就在浪费掉 3 个空间找到 4 的整数倍,也就是 8

例题 2:

union Un2
{
short c[7];
int i;
};
int main()
{ 
   printf("%d\n", sizeof(union Un2));
}
  • short 是短整形占 2 个字节,有 7 个元素,2*7 = 14 个字节
  • int i是整型,占 4 个字节
  • 它们的最大的对齐数是 4 ,而short c[7]所占的空间是14个字节,14 并不是4 的倍数
    那就在浪费掉 2 个空间找到 4 的整数倍,也就是 16
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:34:21  更:2022-07-20 18:37:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 19:33:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码