
承接上文上一节我们完整拆解 HelloWorld 程序理清预处理‑编译‑汇编‑链接完整流程搞懂头文件、main 入口、命名空间的基础规则。本节进入 C 最底层的数据存储基础内置数据类型同时辨析两套常量写法const和#define站在初级工程师工程视角讲清什么时候该用哪一个避开新手常见混用坑。学习说明跳过极少用到的古老奇葩类型只保留业务开发高频内置类型不堆砌教科书式表格重点讲内存大小、取值边界、工程选择、踩坑点。本节学习目标掌握 C 常用基础内置类型整型、浮点、字符、布尔理解各自内存占用与适用场景分清有符号 / 无符号整型的风险看懂溢出带来的隐性 BUG理解字面量、变量、常量三者概念区别掌握const常量用法理解编译期特性看懂#define宏常量的本质理清工程上 const 与 #define 的取舍原则识别类型溢出、无符号负数、宏替换陷阱等高频工程问题完整参考代码一、C 基础内置数据类型1. 整型系列保存整数int最常用整型4 字节业务开发首选存储正负整数short短整型2 字节内存极度受限场景才考虑普通业务极少使用long long长整型8 字节处理大数必须优先使用避免 int 溢出无符号版本unsigned int、unsigned long long只能存非负数⚠️工程坑点 无符号类型赋值负数不会编译报错会发生隐式转换得到一个巨大正数产生隐蔽 BUG 示例unsigned int x -1;最终 x 的实际值为4294967295 日常业务代码尽量少用无符号除非明确处理位、字节、数组长度场景。2. 浮点类型保存小数float单精度4 字节精度有限适合对精度不敏感、追求内存占用场景double双精度8 字节绝大多数业务默认选择C 中浮点字面量默认是 double⚠️工程坑点浮点数不要直接用判断相等存在精度丢失。 正确做法判断两个浮点数差值是否小于一个极小阈值例如fabs(a‑b) 1e‑9。3. 字符类型char1 字节存储单个字符使用单引号包裹例如char c X;本质是小整数可以存 ASCII 编码值。补充支持转义字符常见如换行\n、反斜杠\新手书写路径、换行文本时高频遇到。4. 布尔类型bool布尔类型只有两个取值true/false底层存储 1 字节true等价非 0false等价 0。补充变量初始化好习惯定义变量尽量显式初始化不要使用未初始化变量内存是随机脏数据。二、字面量、变量、常量概念区分字面量写死在代码中的直接值10、3.14、M本身不能修改变量内存空间可以读写修改int val 20; val 30;常量内存空间初始化赋值后运行期间禁止修改。C 有两套实现const、#define三、const 修饰常量onst int BUFFER_SIZE 4096;const修饰的变量定义时必须初始化之后不能修改尝试修改直接编译报错。属于编译器处理是真正的类型安全常量保留完整类型信息。作用域遵循普通变量作用域局部 const 只在函数内部生效全局 const 有文件作用域。小提示C11 以后推荐优先使用 const是工程代码主流写法。四、#define 定义宏常量define MAX_USER 500#define是预处理指令预处理阶段做简单文本字符串替换没有类型检查。预处理阶段代码所有MAX_USER纯文本替换成500编译阶段已经不存在这个符号。典型宏陷阱五、工程取舍const VS #define方案优点缺点适用场景const带类型检查、作用域可控、调试器可以看见符号需要遵循变量作用域绝大多数业务代码优先选 const#define预处理直接替换无内存开销无类型、无作用域、容易出现文本替换 BUG调试看不到宏符号底层宏开关、简单编译期配置业务层尽量少用工程结论业务开发尽量使用const不要用#define去定义普通数值常量。六、新手高频踩坑汇总int 存储过大数值发生整数溢出不会崩溃产生错误结果属于隐蔽 BUG大数直接上long long。给 unsigned 变量赋值负数静默转换超大正数逻辑异常例如unsigned int x -1得到 4294967295。const 常量忘记初始化直接编译报错。#define 宏常量表达式缺少括号替换后运算优先级错乱。浮点数使用直接对比两个小数精度丢失判断失效改用差值小于极小值如 1e‑9做判断。char 使用双引号赋值混淆字符与字符串编译报错同时留意\n、\\这类转义字符书写。本期思考题const int a 10;尝试写a 20;会在编译期还是运行时报错为什么业务代码不推荐大量使用 #define 定义数值常量int 和 long long 同样存整数什么时候必须选 long long下期预告下一节cin/cout控制台输入输出与std命名空间规范