基础阶段 — Unit 1: C Fundamentals(C 语言核心语法与工程实践)
"C is quirky, flawed, and an enormous success." — Dennis Ritchie
实验仓库: Unit-1-C-Fundamentals
一、阶段定位与目标
本阶段是 C 语言训练营的第二站,承接 Unit 0(C Primer)建立的"编辑—编译—运行"基础认知,正式进入 C 语言核心语法的系统学习。如果说 Unit 0 是"学会写第一个程序",那么 Unit 1 就是"掌握 C 语言的全貌"。
根据训练营总体规划,本阶段旨在解决"学员会写简单程序但不懂 C 语言全貌"这一核心问题。设计思路为:语法为骨,项目为肉——每引入一个语法特性,立刻用一个真实小项目来巩固。
主要目标
- 掌握 C 语言核心语法全貌:嵌套循环、函数定义与调用、一维/二维数组、字符数组与字符串、结构体(struct)、联合体(union)、位运算、指针(含函数指针)、可变参数(variadic function)、预处理指令(#define / #include / 条件编译)。
- 建立"状态机"编程思维:通过词法分析器、命令解释器、注释去除器等项目,学会用有限状态机(FSM)思想组织代码——这是从"写脚本"到"写工程"的关键跨越。
- 理解指针与内存模型:从 mystrcpy 的指针版实现,到 union 判断大小端,再到可变参数 myprintf 的 va_list 机制,逐步建立对 C 语言内存布局的直觉。
- 为后续阶段铺路:本阶段的 19 个 Lesson(40 道小题)覆盖了 Unit 2(数据结构与算法)所需的全部语法基础,并为 Unit 3(CS 经典问题)和 Unit 4(编译器实现)中的词法分析、状态机、函数指针表等技术打下根基。
授课形式
与 Unit 0(C Primer,纯自学)不同,本阶段采用腾讯会议直播授课,共两节:
| 节次 | 时间 | 内容 |
|---|---|---|
| 第一节 | 2026 年 06 月 29 日 20:00 | Lesson 6-14:循环、函数、数组、结构体、联合体、位运算 |
| 第二节 | 2026 年 07 月 01 日 20:00 | Lesson 15-24:指针、可变参数、状态机、预处理器、词法分析器、综合项目 |
每节直播约 2 小时,包含语法讲解、代码实战、现场答疑。直播录像会回传至训练营知识库供回看。
学习依托
- 训练营维护的 clings 练习仓库(19 个 Lesson,共 40 道小题)
- 每个 Lesson 配套的 README 讲义(含算法推导、代码示例、课堂讨论与课后练习)
- CNB 云原生开发环境(一键开箱)或本地 GCC 环境
二、主要内容与学习路径
本阶段通过 19 个递进式 Lesson(40 道小题),覆盖以下知识模块:
Lesson 6 — 九九乘法表(1 道题)
- 掌握嵌套
for循环的结构与执行流程。 - 学习格式化输出
%2d(右对齐占位)。 - 理解循环不变量与边界条件。
Lesson 7 — 100 以内最大素数(1 道题)
- 学会函数定义与调用,理解"函数是代码复用的基本单位"。
- 掌握
break语句提前退出循环。 - 复习
if-else条件分支与取模运算。
Lesson 8 — 统计数字 9 的个数(1 道题)
- 通过函数封装"统计某数字出现次数"的逻辑。
- 理解整数除法
/与取模%的配合使用。 - 学习从个位到高位的逐位提取技巧。
Lesson 9 — 整数转字符串(2 道题)
- 掌握字符数组(字符串)的存储模型:
'\0'结尾。 - 学会
itoa函数(整数转字符串)的实现,理解"逆序填充"技巧。 - 扩展:十六进制转换
itoa_hex,认识 a-f 字符映射。
Lesson 10 — 约瑟夫环(2 道题)
- 用数组模拟链表:
next[]数组记录"下一个"索引。 - 理解环形数据结构的表示方法。
- 掌握"删人"操作的本质:修改 next 指针跳过被删元素。
Lesson 11 — 两点距离(1 道题)
- 学会
struct结构体定义与成员访问(.运算符)。 - 掌握
math.h中sqrt函数的使用。 - 理解"用结构体组织相关数据"的设计思想。
Lesson 12 — 判断大小端(1 道题)
- 掌握
union联合体的内存共享机制。 - 理解大端序(Big-Endian)与小端序(Little-Endian)的区别。
- 通过
return返回值模式(而非 stdout)完成验证。
Lesson 13 — 车辆限行(3 道题)
- 学会
switch-case多分支结构。 - 掌握三元运算符
?:的简洁表达。 - 综合运用函数、字符串处理、条件判断完成完整程序。
Lesson 14 — 迷宫出路(2 道题)
- 掌握二维数组表示棋盘/地图。
- 学会用
struct组织方向向量(dx/dy)。 - 初步接触深度优先搜索(DFS)思想。
Lesson 15 — 统计 bit 1 的个数(3 道题)
- 掌握位运算符
& | ^ ~ << >>。 - 学习三种 popcount 实现:逐位检测、
n&(n-1)清最低位、分治法。 - 理解"同一问题多种解法"的工程思维。
Lesson 16 — 实现 strcpy(2 道题)
- 掌握指针的基本操作:解引用
*、指针递增++。 - 理解"指针版 strcpy"比"数组版 strcpy"更简洁的原因。
- 学习 delta 指针优化技巧。
Lesson 17 — 单词计数(1 道题)
- 学会用状态机(FSM)思想统计单词个数。
- 理解"状态转移":从空白状态到单词状态、再回到空白状态。
- 初步建立"用状态组织代码"的思维。
Lesson 18 — 实现 printf(3 道题)
- 掌握可变参数函数:
va_list/va_start/va_arg/va_end。 - 学会
itoa与myprintf的配合使用。 - 理解格式化字符串
%d %x %s的解析与分发。 - 这是本阶段最具挑战的练习之一——亲手实现 C 标准库最常用的函数。
Lesson 19 — 命令解释器 Shell(4 道题)
- 掌握函数指针:用函数指针实现命令分发。
- 学会
struct组织命令表(命令名 + 处理函数指针)。 - 综合运用状态机切分命令行、函数指针分发执行。
- 这是 Linux shell 工作原理的简化版。
Lesson 20 — 预处理器(3 道题)
- 学会用状态机去除 C 代码中的注释(
/* */和//)。 - 掌握
getword词法切分函数。 - 实现表驱动状态机完成简单的宏展开(
#define)。 - 理解 C 预处理器的工作原理。
Lesson 21 — 词法分析器(1 道题)
- 用确定性有限自动机(DFA)实现 C 语言词法分析器。
- 识别关键字、标识符、数字、运算符、字符串字面量。
- 这是编译器前端的第一步,为 Unit 4 编译器项目预热。
Lesson 22 — 猜数字游戏(3 道题)
- 学会
rand()随机数生成与不重复数位检测。 - 掌握双重循环计算 ?A?B(数字位置正确/数值正确)。
- 综合实现游戏循环:生成 → 猜测 → 反馈 → 重试。
Lesson 23 — 五子棋(3 道题)
- 掌握二维数组表示棋盘与落子。
- 学会方向扫描判断胜负(横/竖/正斜/反斜)。
- 综合实现完整对弈循环:画棋盘 → 落子 → 判胜 → 切换玩家。
Lesson 24 — 搜索引擎(3 道题)
- 掌握字符串大小写不敏感匹配。
- 学会从 HTML 文本中提取
<a href="...">链接。 - 综合实现"输入关键词 → 搜索 HTML → 输出匹配链接"的迷你搜索引擎。
练习工具 — clings
- 使用训练营基于 CNB 云原生开发环境的 clings 练习仓库进行交互式练习。
- 通过 Rustlings 风格的"读报错、修代码、保存即验证"的方式逐题过关。
- 训练营会自动统计您的完成情况并记入阶段成绩。
三、推荐学习资料
以下资料可作为本阶段的主要参考:
核心教材
- 《C 程序设计语言》(The C Programming Language, K&R):第 4-7 章覆盖函数、指针、结构体、输入输出。强烈推荐边读边做练习。
- 《C Primer Plus》:第 9-16 章详细讲解函数、数组、指针、字符串、结构体、联合体、位运算。适合零基础读者系统学习。
- 《C Programming: A Modern Approach》(K.N. King):第 9-20 章覆盖函数、数组、指针、字符串、结构体、联合体、枚举、预处理器。结构清晰,习题丰富。
在线教程
- Learn C — interactive tutorial:含函数、指针、结构体、函数指针等交互式章节。
- C Programming Tutorial — GeeksforGeeks:覆盖函数、数组、字符串、指针、结构体、内存管理。
- 一站式学习 C 编程 — 宋劲杉
参考资料(进阶)
- Variadic Functions in C — GeeksforGeeks:Lesson 18 myprintf 的核心机制。
- Variadic Macros — GCC 文档:预处理器的可变参数宏。
- C Language BNF 范式
- Function Pointers in C:Lesson 19 命令分发的核心。
- Lexical Analyser in C — GeeksforGeeks:Lesson 21 词法分析器参考。
开发环境搭建
- 推荐使用 CNB 云原生开发环境(Fork 仓库后一键启动,无需本地配置)。
- 本地开发推荐 Linux 环境(WSL2 + Ubuntu 或虚拟机),安装 GCC 和 Python 3.11+。
- 安装 clings 练习工具:推荐使用
uvx clings@latest命令(无需全局安装,隔离运行)。
四、学习方式与建议
先读讲义,再做练习:每个 Lesson 目录下的 README.md 包含算法推导、代码示例、状态机图解和课堂讨论题。建议先通读讲义,理解知识点后再动手修改 .c 文件。
善用 clings 工具:进入 clings 的 watch 模式后,每次保存文件会自动编译和验证。遇到卡壳时按
h查看提示,按l浏览题目列表,按t查看测试用例(TDD 开发)。重视指针与内存:本阶段是指针的"入门关"。从 Lesson 16 的 strcpy 开始,到 Lesson 18 的 va_list 可变参数,再到 Lesson 19 的函数指针——每一步都在深化对内存模型的理解。务必动手画内存图。
思考"状态机思维":Lesson 17(单词计数)、Lesson 19(shell 解析)、Lesson 20(去注释/宏展开)、Lesson 21(词法分析)四个练习构成了"状态机四连击"。学会用"当前状态 + 输入 → 新状态"的方式组织代码,是后续编译器和系统编程的核心技能。
动手做综合项目:Lesson 18(myprintf)、Lesson 19(shell)、Lesson 23(五子棋)、Lesson 24(搜索引擎)是本阶段的四个综合项目。它们各需 20-50 行代码,综合运用函数、指针、结构体、状态机等多项技能,完成后会极大提升编程自信心。
按时参加直播:本阶段有两节腾讯会议直播课(06/29 和 07/01),建议按时参加以获得最佳学习效果。直播中会现场演示代码编写过程,并解答疑问。如无法参加,请务必在课后观看回放。
五、关于晋级与要求
晋级方式
- Fork 训练营的 Unit-1-C-Fundamentals 仓库,在云原生开发环境或本地环境中完成 40 道练习题。
- 提交代码到 main 分支并创建合并请求(PR),CI 系统会自动评分。
- 可多次提交,以最高分为准。通过后即可在 OpenCamp 晋级榜单上查看成绩。
评分标准
- 共 19 个 Lesson、40 道小题,每题通过 clings 自动评测。
- 评测模式包括返回值检查(return)、标准输出比对(stdout)、编译验证(compile)三种。
重要提示
本阶段是 C 语言训练营的基础关,题目从 1 行代码(Lesson 6 乘法表)到 50 行代码(Lesson 19 shell、Lesson 24 搜索引擎)逐步递进。40 道题看似量大,但每题平均只需编写约 14 行 C 代码——关键是理解每个语法特性的设计意图,而非死记语法。认真完成本阶段后,您将具备阅读和编写中等规模 C 程序的能力,为 Unit 2(数据结构与算法)和 Unit 3(CS 经典问题)打下坚实基础。
六、训练营完整学习路线
本 C 语言训练营采用 "四阶段 + 双项目" 的成长路径,从零基础入门到亲手实现编译器与操作系统内核,共 6 个 Unit,共计 120 课。最终目标:学员同时具备用 C 语言实现编译器和从裸机搭建操作系统内核的系统级编程能力,形成"语言 → 算法 → 系统 → 编译器 → 内核"的完整知识闭环。
导学阶段
| Unit | 名称 | 课程数 | 核心内容 |
|---|---|---|---|
| Unit 0 | C Primer | 5 课 / 9 题 | 最简程序、printf、循环、条件分支、累加求和 |
从"编辑 — 编译 — 运行"的全流程入手,通过 5 个最小可运行程序建立 C 语言的基本心智模型。使用 clings 工具交互式练习。
基础阶段
| Unit | 名称 | 课程数 | 核心内容 |
|---|---|---|---|
| Unit 1 | C Fundamentals | 19 课 / 40 题 | 嵌套循环、函数、数组、指针、结构体、联合体、位运算、可变参数、预处理器、状态机 |
从九九乘法表到词法分析器,涵盖 C 语言核心语法特性。通过实现 printf、命令解释器、预处理器、词法分析器等项目,将语法知识转化为工程能力。
进阶阶段
| Unit | 名称 | 课程数 | 核心内容 |
|---|---|---|---|
| Unit 2 | C Essentials | 24 课 | 链表、栈、队列、树、堆、散列表、排序、查找、递归、动态规划 |
系统学习经典数据结构与算法,从文件操作(cp/sed/ELF 解析)到命令行工具(计算器/sort/ls/MyBash),最终完成地图导航综合项目。
专业阶段
| Unit | 名称 | 课程数 | 核心内容 |
|---|---|---|---|
| Unit 3 | C Classicals | 24 课 | 哲学家就餐、停等协议、LL(1) 解析器、B+ 树、光线追踪、A*寻路、RSA、向量时钟、缓存模拟、Aho-Corasick、NFA→DFA、测试框架、缓冲区溢出、感知机、LU 分解、无锁环形缓冲、标记清除 GC、图灵机、FFT、Sobel 边缘检测、TF-IDF、量子比特、PoW 区块链、终端计算器 |
覆盖计算机科学 17 个子领域的经典问题,每题平均编写约 96 行 C 代码,为编译器项目建立广阔的 CS 视野。
项目阶段
完成前三个阶段后,进入双线并行的项目实践:
| Unit | 名称 | 课程数 | 核心内容 |
|---|---|---|---|
| Unit 4 | C Compiler | 24 课 | 从零实现 C 编译器 nccl-cc:一棵 AST,四个后端,五个运行环境 |
| Unit 5 | C Kernel | 24 课 | 从零实现操作系统内核 Avatar OS:裸机引导到多核调度 |
Unit 4 — C Compiler 用约 4000 行 C 代码完整走通"预处理 → 词法 → 语法 → 类型标注 → 代码生成"全流程,支持 RISC-V / ARM / AArch64 / x86-64 四个后端和 Linux 用户态 + 裸机共五种运行环境。最终验证:用自己写的编译器编译约瑟夫环程序,在四个架构上得到相同结果。
Unit 5 — C Kernel 基于 Avatar OS 真实内核代码,分五个子阶段递进:裸机基础 → 内存与同步 → 中断与定时器 → 多任务 → 用户态与多核。代码取自 Avatar OS 仓库,支持 AArch64 / RISC-V 64 / x86_64 三架构在 QEMU 上验证。最终目标:一个能运行 busybox shell、在多核处理器上并行调度的完整操作系统。