掘根宝典之C语言联合和枚举
联合
C语言中的联合(Union)是一种特殊的数据类型,它允许在同一块内存空间中存储不同类型的数据。
联合与结构体类似,但不同的是,在给联合变量赋值时,它只能存储最后一次赋值的值。
创建联合
在C语言中,可以使用 union 关键字来创建联合。 联合的定义语法如下:
union union_name {member_type1 member_name1;member_type2 member_name2;...
};
其中,union_name 是联合的名称,member_type1、member_type2 等是联合的成员变量的数据类型,member_name1、member_name2 等是联合的成员变量的名称。
下面是一个例子,演示如何创建联合:
#include <stdio.h>union Data {int i;float f;char str[20];
};int main() {union Data data;data.i = 10;printf("data.i: %d\n", data.i);data.f = 3.14;printf("data.f: %f\n", data.f);strcpy(data.str, "Hello, C!");printf("data.str: %s\n", data.str);return 0;
}
在这个例子中,我们定义了一个名为 Data 的联合,它有三个成员变量:一个整型变量 i,一个浮点型变量 f,一个字符数组 str。在 main 函数中,我们创建了一个 Data 类型的变量 data,并对它的成员变量进行了赋值和输出。
需要注意的是,联合在内存中存储的大小为其成员变量中占用空间最大的那个。在上面的例子中,整型占用了4个字节,浮点型占用了4个字节,字符数组占用了20个字节,所以该联合所占用的内存大小为20个字节。
注意点
在使用联合时,有一些需要注意的地方:
-
联合的成员变量共享同一块内存空间。这意味着只能同时使用一个成员变量,对一个成员变量的改变会影响其他成员变量的值。
-
联合的大小取决于其中最大的成员变量的大小。联合的大小足够容纳最大成员变量的大小,其他成员变量可能占用未使用的空间。因此,联合的大小可以比成员变量所需的总和更大。
-
对于联合的成员变量,只能访问最后一次赋值的成员变量。在给联合的一个成员变量赋值后,其他成员变量的值会被覆盖。因此,在访问联合的成员变量之前,需要确保已经为其正确地赋值。
-
联合可以作为结构体的成员。这种嵌套的使用可以帮助创建更复杂的数据结构。
下面是一个示例,演示了一些联合的注意点:
#include <stdio.h>union Data {int i;float f;char str[20];
};struct Book {char title[50];union Data price;
};int main() {union Data data;data.i = 10;printf("data.i: %d\n", data.i);data.f = 3.14;printf("data.f: %f\n", data.f);printf("data.i after assigning data.f: %d\n", data.i);struct Book book;strcpy(book.title, "C Programming");book.price.f = 29.99;printf("Book title: %s\n", book.title);printf("Book price: %f\n", book.price.f);return 0;
}
在这个例子中,我们定义了一个联合 Data,其中包含一个整型变量 i、一个浮点型变量 f 和一个字符数组 str。我们还定义了一个结构体 Book,其中包含一个字符数组 title 和一个联合 price。在 main 函数中,我们演示了如何使用联合,同时注意到了联合的共享内存和覆盖成员变量的特性。
枚举
C语言中的枚举是一种用户自定义类型,用于定义一组命名的常量。枚举成员可以具有不同的值,每个成员可以用一个标识符来表示。
以下是创建和使用枚举的一般步骤:
- 定义枚举类型:
enum 枚举类型名 {成员1,成员2,...
};
在定义枚举类型时,可以直接给成员赋予特定的值(默认情况下,第一个成员的值为0,后续成员的值递增)。
- 声明变量并使用枚举类型:
enum 枚举类型名 变量名;
变量名 = 成员;
或者可以在声明变量的同时初始化:
enum 枚举类型名 {成员1,成员2,...
} 变量名 = {成员值};
以下是一个简单的示例,演示了如何创建和使用枚举:
#include <stdio.h>enum Day {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
};int main() {enum Day today = Wednesday;printf("Today is %d\n", today);return 0;
}
在这个例子中,我们定义了一个枚举类型 Day,它包含了一周的所有天。我们通过声明一个变量 today 并将其初始化为 Wednesday 来使用枚举。最后,我们打印出 today 的值,它会输出为 2,对应着枚举类型中的 Wednesday。
赋值
在C语言中,可以手动为枚举类型的成员赋值。有三种常见的赋值方式:
- 默认赋值:如果没有为枚举成员指定值,编译器将默认给出一个递增的值,从0开始。
- 手动赋值:可以手动为每个枚举成员指定一个值。被赋予相同值的成员将被视为相等。
- 使用自增操作符:可以通过使用自增操作符为枚举成员指定连续增加的值。
以下是每种赋值方式的示例:
- 默认赋值:
enum Weekday {Monday, // 值为0Tuesday, // 值为1Wednesday, // 值为2Thursday, // 值为3Friday // 值为4
};
在这个示例中,如果没有为枚举成员指定值,编译器会默认进行递增的赋值。
- 手动赋值:
enum Color {Red = 1,Green = 2,Blue = 4,Yellow = 8
};
在这个示例中,我们为每个枚举成员指定了一个值。被赋予相同值的成员将被视为相等。
- 使用自增操作符:
enum Month {January = 1,February, // 值为2March, // 值为3April, // 值为4May = 8,June, // 值为9July // 值为10
};
在这个示例中,我们通过使用自增操作符为部分枚举成员指定了连续增加的值。
注意:当为枚举成员赋值时,最好使用明确的整数值,并确保它们在枚举类型的取值范围内。
枚举的使用
C语言中的枚举是一种用户定义的数据类型,用于表示一组相关的常量。以下是C语言枚举的具体用法:
- 定义枚举类型:
enum Weekday {MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
};
上述代码定义了一个名为Weekday的枚举类型,其中包含了七个枚举常量,分别对应星期一到星期日。
- 声明枚举变量:
enum Weekday today;
上述代码声明了一个名为today的枚举变量,用于存储当前的星期几。
- 给枚举变量赋值:
today = MONDAY;
上述代码将MONDAY这个枚举常量的值赋给了today变量。
- 使用枚举变量:
if (today == MONDAY) {printf("Today is Monday.\n");
}
上述代码使用了条件语句判断当前是星期一,并输出对应的信息。
枚举还可以用于Switch语句中:
switch (today) {case MONDAY:printf("Today is Monday.\n");break;case TUESDAY:printf("Today is Tuesday.\n");break;// ... 其他星期几的情况default:printf("Unknown weekday.\n");break;
}
枚举还可以配合结构体一起使用,以表示更复杂的数据类型。
总之,C语言的枚举提供了一种方便的方式来定义和使用常量,增加了代码的可读性和可维护性。
枚举的注意点
在使用C语言枚举时,需要注意以下几个事项:
-
枚举常量的命名:枚举常量的命名应该具有描述性,清晰明确,以便于理解和维护代码。常见的做法是使用大写字母命名,并使用下划线分隔单词。
-
枚举常量的赋值:默认情况下,枚举常量会按照从0开始的顺序自动赋值,依次递增。但是可以手动指定枚举常量的值。如果手动赋值,则后续枚举常量会根据前一个常量的值递增。
-
枚举变量的类型:枚举变量的类型是枚举类型本身,不是整数类型。因此,不能将整数直接赋值给枚举变量,也不能将枚举变量与整数进行比较。
-
枚举变量的大小:枚举变量的大小取决于编译器对枚举类型的实现方式。一般情况下,枚举变量的大小与整数类型相同,但具体的大小可能会有一些差异。
-
枚举的作用域:枚举类型和枚举常量的作用域与其他变量类似。可以在函数内部、函数外部或结构体内部定义枚举类型和枚举常量。
-
嵌套枚举:C语言允许在枚举内部嵌套定义枚举类型,形成嵌套枚举。嵌套枚举的作用域与普通枚举相同,但是需要使用完整的名称来引用嵌套的常量。
以上是在使用C语言枚举时需要注意的一些事项。遵循这些注意事项可以更好地使用枚举,提高代码的可读性和可维护性。
相关文章:
掘根宝典之C语言联合和枚举
联合 C语言中的联合(Union)是一种特殊的数据类型,它允许在同一块内存空间中存储不同类型的数据。 联合与结构体类似,但不同的是,在给联合变量赋值时,它只能存储最后一次赋值的值。 创建联合 在C语言中&…...
【debug】element-ui时间控件回显后不可编辑且显示为空
问题:使用element-ui的时间控件回显数据,编辑数据没有反应:点时间和“确认”按钮都没反应。 输入框中会显示数据,但提交时的校验显示为空。 <el-form-item label"开始时间" prop"limitStartTime"><…...
【Linux从青铜到王者】进程信号
——————————————————————————————————————————— 信号入门 在了解信号之前有许多要理解的相关概念 我们可以先通过一个生活例子来初步认识一下信号 1.生活角度的信号 你在网上买了很多件商品,再等待不同商品快递的到来…...
MyBatis-Plus 快速入门
介绍 jMyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 官网:MyBatis-Plus (baomidou.com) 1.…...
iOS调起高德/百度/腾讯/谷歌/苹果地图并使用GCJ02坐标进行导航
使用演示: 2.地图API相关网站 : 高德:...
HarmonyOS Full SDK的安装
OpenHarmony的应用开发工具HUAWEI DevEco Studio现在随着OpenHarmony版本发布而发布,只能在版本发布说明中下载,例如最新版本的OpenHarmony 4.0 Release。对应的需要下载DevEco Studio 4.0 Release,如下图。 图片 下载Full SDK主要有两种方式,一种是通过DevEco Studio下载…...
小程序嵌套H5-真机突然无法使用
今天测试反馈了一个问题,测试环境的小程序突然就登录不了了。我自己拿手机扫码登录是正常的,用其他同事的手机扫描登录也是正常。 下面是排查的路线: 1、其他环境使用测试手机扫码登录是否正常?(正常) 2、H5地址改为本地IP&#…...
自然语言处理 | 语言模型(LM) 浅析
自然语言处理(NLP)中的语言模型(Language Model, LM)是一种统计模型,它的目标是计算一个给定文本序列的概率分布,即对于任意给定的一段文本序列(单词序列),语言模型能够估…...
全量知识系统问题及SmartChat给出的答复 之13 解析器+DDD+文法型
Q32. DDD的领域概念和知识系统中设计的解析器之间的关系。 那下面,我们回到前面的问题上来。 前面说到了三种语法解析器,分别是 形式语言的(机器或计算机语言)、人工语言的和自然语言的。再前面,我们聊到了DDD设计思…...
华中某科技大学校园网疑似dns劫持的解决方法
问题 在校园网ping xxx.ddns.net,域名解析失败 使用热点ping xxx.ddns.net,可以ping通 尝试设置windows dns首选dns为114.114.114.114,重新ping,仍然域名解析失败 猜测【校园网可能劫持dns请求】 解决方法 使用加密的dns请求…...
模型部署 - onnx 的导出和分析 -(1) - PyTorch 导出 ONNX - 学习记录
onnx 的导出和分析 一、PyTorch 导出 ONNX 的方法1.1、一个简单的例子 -- 将线性模型转成 onnx1.2、导出多个输出头的模型1.3、导出含有动态维度的模型 二、pytorch 导出 onnx 不成功的时候如何解决2.1、修改 opset 的版本2.2、替换 pytorch 中的算子组合2.3、在 pytorch 登记&…...
【鸿蒙 HarmonyOS 4.0】多设备响应式布局
一、背景 在渲染页面时,需要根据不同屏幕大小渲染出不同的效果,动态的判断设备屏幕大小,便需要采用多设备响应式布局。这种设计方法能够动态适配各种屏幕大小,确保网站在不同设备上都能呈现出最佳的效果。 二、媒体查询…...
Android ANR 日志分析定位
ANR 是 Android 应用程序中的 "Application Not Responding" 的缩写,中文意思是 "应用程序无响应"。这是当应用程序在 Android 系统上运行时,由于某种原因不能及时响应用户输入事件或执行一个操作,导致界面无法更新&…...
Optional 详解
Optional 详解 1、Optional 介绍2、创建 Optional 对象3、Optional 常用方法1. 判断值是否存在 — isPresent()2. 非空表达式 — ifPresent()3. 设置(获取)默认值 — orElse()、orElseGet()4. 获取值 — get()5. 过滤值 — filter()6. 转换值 — map() 作为一名 Java 程序员&am…...
(科目三)数据库基础知识
1、基本概念 1.1 数据库 1、数据、信息和数据处理 数据是指表达信息的某种物理符号; 信息是对客观事物的反映,是为某一特定目的二提供的决策数据; 数据处理是指将数据转换成信息的过程,是对各类型的数据进行收集、整理、存储、…...
Unity性能优化篇(十) 模型优化之网格合并 Easy Mesh Combine Tool插件使用以及代码实现网格合并
把多个模型的网格合并为一个网格。可以使用自己写代码,使用Unity自带的CombineMeshes方法,也可以使用资源商店的插件,在资源商店搜Mesh Combine可以搜索到相关的插件,例如Easy Mesh Combine Tool等插件。 可大幅度减少Batches数量…...
0.8秒一张图40hx矿卡stable diffusion webui 高质极速出图组合(24.3.3)
新消息是。经过三个月的等待,SD Webui (automatic1111)终于推出了新版本1.8.0,本次版本最大的更新,可能就是pytorch更新到2.1.2, 不过还是晚了pytorch 2.2.2版。 不过这版的一些更新,在forget分支上早就实现了,所以。…...
手写分布式配置中心(四)增加实时刷新功能(长轮询)
上一篇文章中实现了短轮询,不过短轮询的弊端也很明显,如果请求的频率较高,那么就会导致服务端压力大(并发高);如果请求的频率放低,那么客户端感知变更的及时性就会降低。所以我们来看另一种轮询…...
03 | 事务隔离:为什么你改了我还看不见?
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。 转账过程具体到程序里会有一系列的操作,比如查询余…...
Jmeter读取与使用Redis数据
Jmeter 作为当前非常受欢迎的接口测试和性能测试的工具,在企业中得到非常广泛的使用,而 Redis 作为缓存数据库,也在企业中得到普遍使用, Redis服务和客户端安装 windows下安装 默认端口:6379 下载地址: …...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
