本文对应 C 语言学习第十五天的核心内容系统梳理共用体联合体、枚举类型、位运算三大模块的基础语法、核心用法与高频易错点。文章目录一、共用体联合体 union1. 核心本质2. 定义与使用语法3. 内存大小计算4. 经典应用判断系统大小端5. 高频易错点二、枚举类型 enum1. 核心作用2. 定义与默认取值3. 手动赋值示例4. 高频易错点三、位运算1. 位运算符总览2. 三大经典位操作3. 位移运算注意事项4. 高频易错点四、代码实战通用踩坑总结结合作业易错点五、学习总结一、共用体联合体 union1. 核心本质共用体也叫联合体是 C 语言的自定义数据类型核心特征是所有成员共享同一块内存空间这也是它和结构体最本质的区别结构体 struct每个成员拥有独立的内存空间互不影响总大小为各成员大小之和含内存对齐共用体 union所有成员共用同一段起始地址的内存同一时间只能有效存储一个成员的值2. 定义与使用语法// 定义共用体类型 union Data { int a; char b; float c; }; // 定义共用体变量 union Data data;3. 内存大小计算共用体的总大小 占用内存最大的成员的大小同时需要满足内存对齐规则。 以上面的union Data为例int 占 4 字节char 占 1 字节float 占 4 字节最大成员大小为 4 字节因此该共用体变量占用 4 字节4. 经典应用判断系统大小端利用共用体共享内存的特性可以判断当前系统的字节存储序小端模式内存低地址存放数据的低字节高地址存放高字节大端模式内存低地址存放数据的高字节高地址存放低字节#include stdio.h int check_endian(void) { union { int a; char b; } test; test.a 1; return test.b; // 小端返回1大端返回0 } int main() { if (check_endian()) { printf(当前系统为小端模式\n); } else { printf(当前系统为大端模式\n); } return 0; }5. 高频易错点不能同时给多个成员赋值由于内存共享修改一个成员会覆盖其他成员的值同一时间只有一个成员有效。混淆结构体与共用体结构体总大小是各成员大小之和含对齐共用体取最大成员大小切勿记混。大小端概念记反口诀辅助记忆 ——小端低低大端低高小端低地址存低字节大端低地址存高字节。二、枚举类型 enum1. 核心作用枚举用于定义一组命名的整型常量所有枚举常量的本质都是int类型主要用来提高代码可读性用有意义的单词代替魔法数字。2. 定义与默认取值enum weekday { MONDAY, // 默认值 0 TUESDAY, // 1 WEDNESDAY, // 2 THURSDAY, // 3 FRIDAY, // 4 SATURDAY, // 5 SUNDAY // 6 };取值规则第一个枚举常量默认值为 0后续常量的值默认 前一个常量的值 1支持手动指定某个常量的值后续常量依旧在前一个基础上 13. 手动赋值示例enum weekday { MONDAY 1, // 手动设为1 TUESDAY, // 2 WEDNESDAY, // 3 };4. 高频易错点语法括号错误枚举常量必须全部写在大括号内部把常量写在枚举定义外部属于语法错误enum weekday { MONDAY, ... SATURDAY, }; SUNDAY, // ❌ 错误写在了枚举大括号外部枚举常量不能被赋值枚举元素是常量运行中不能写MONDAY 10;编译会直接报错。误以为是字符串类型枚举常量本质是 int 整数直接printf(%s, MONDAY)是错误的只能打印整数值。同名冲突同一作用域内不同枚举的常量名不能重复。三、位运算位运算直接对二进制位进行操作是 C 语言底层操作的核心也是嵌入式开发、笔试面试的高频考点。1. 位运算符总览运算符名称运算规则按位与对应位全 1 才为 1有 0 则为 0按位或对应位有 1 则为 1全 0 才为 0^按位异或对应位不同为 1相同为 0~按位取反0 变 11 变 0单目运算符左移二进制位左移低位补 0右移二进制位右移无符号数补 0有符号数补符号位速记口诀与 0 得 0或 1 置 1异或取反。2. 三大经典位操作1将变量的第 n 位置 1num | (1 n);原理将 1 左移 n 位得到只有第 n 位为 1、其余位为 0 的数再和原数按位或即可把第 n 位置 1且不影响其他位。2将变量的第 n 位清 0num ~(1 n);原理先将 1 左移 n 位再按位取反得到只有第 n 位为 0、其余位为 1 的数和原数按位与即可清零第 n 位。3异或实现两数交换无需临时变量a a ^ b; b a ^ b; a a ^ b;原理利用异或的性质 —— 一个数异或自身等于 0异或 0 等于自身。3. 位移运算注意事项左移在不溢出的前提下相当于数值乘以 2^n右移对于有符号数多数编译器采用算术右移高位补符号位无符号数采用逻辑右移高位补 0位移位数不能为负数也不能超过数据类型的总位数否则结果属于未定义行为4. 高频易错点运算符优先级混淆位运算符优先级低于算术运算符、关系运算符复杂表达式建议加括号避免出错比如1 n 1会先算加法再移位和预期逻辑不符。按位取反和逻辑非混淆~是对每一位二进制逐位取反!是对整体逻辑真假取反二者完全不同。异或交换的陷阱如果两个变量指向同一块内存比如自己和自己交换执行后结果会变成 0使用前要确保两个变量地址不同。忽略符号位对有符号负数进行右移操作时要注意高位补的是 1不是 0。四、代码实战通用踩坑总结结合作业易错点结合近期代码编写中的典型错误整理通用避坑指南循环变量忘记更新导致死循环手写反转、遍历函数时while 循环内只写业务逻辑忘记start、end--导致循环条件永远成立程序直接卡死。边界条件遗漏处理字符串、数组时循环终止条件草率写成 len导致最后一个元素、最后一个单词没有被处理要根据逻辑判断是否需要 len。整数除法丢失精度两个 int 相除默认是整数除法小数部分直接截断求平均分、平均值时必须先强制转换其中一个数为浮点型再做除法。输入函数踩坑scanf(%s)遇到空格就停止读取无法读取带空格的整行字符串计数器 / 累加器忘记清零在多层循环中处理每一个元素前计数变量、求和变量必须重置为 0否则会累积上一轮的结果导致逻辑完全错误。五、学习总结共用体核心是内存共享常用于大小端判断、节省内存的多类型数据存储场景。枚举本质是整型常量集合作用是提升代码可读性注意语法规范和默认取值规则。位运算直接操作二进制是嵌入式开发、底层优化的基础重点掌握置 1、清 0、交换三个经典操作牢记运算符规则与优先级陷阱。