跳转到内容

基础阶段 — 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 语言全貌"这一核心问题。设计思路为:语法为骨,项目为肉——每引入一个语法特性,立刻用一个真实小项目来巩固。

主要目标

  1. 掌握 C 语言核心语法全貌:嵌套循环、函数定义与调用、一维/二维数组、字符数组与字符串、结构体(struct)、联合体(union)、位运算、指针(含函数指针)、可变参数(variadic function)、预处理指令(#define / #include / 条件编译)。
  2. 建立"状态机"编程思维:通过词法分析器、命令解释器、注释去除器等项目,学会用有限状态机(FSM)思想组织代码——这是从"写脚本"到"写工程"的关键跨越。
  3. 理解指针与内存模型:从 mystrcpy 的指针版实现,到 union 判断大小端,再到可变参数 myprintf 的 va_list 机制,逐步建立对 C 语言内存布局的直觉。
  4. 为后续阶段铺路:本阶段的 19 个 Lesson(40 道小题)覆盖了 Unit 2(数据结构与算法)所需的全部语法基础,并为 Unit 3(CS 经典问题)和 Unit 4(编译器实现)中的词法分析、状态机、函数指针表等技术打下根基。

授课形式

与 Unit 0(C Primer,纯自学)不同,本阶段采用腾讯会议直播授课,共两节:

节次时间内容
第一节2026 年 06 月 29 日 20:00Lesson 6-14:循环、函数、数组、结构体、联合体、位运算
第二节2026 年 07 月 01 日 20:00Lesson 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.hsqrt 函数的使用。
  • 理解"用结构体组织相关数据"的设计思想。

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
  • 学会 itoamyprintf 的配合使用。
  • 理解格式化字符串 %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 章覆盖函数、数组、指针、字符串、结构体、联合体、枚举、预处理器。结构清晰,习题丰富。

在线教程

参考资料(进阶)

开发环境搭建

  • 推荐使用 CNB 云原生开发环境(Fork 仓库后一键启动,无需本地配置)。
  • 本地开发推荐 Linux 环境(WSL2 + Ubuntu 或虚拟机),安装 GCC 和 Python 3.11+。
  • 安装 clings 练习工具:推荐使用 uvx clings@latest 命令(无需全局安装,隔离运行)。

四、学习方式与建议

  1. 先读讲义,再做练习:每个 Lesson 目录下的 README.md 包含算法推导、代码示例、状态机图解和课堂讨论题。建议先通读讲义,理解知识点后再动手修改 .c 文件。

  2. 善用 clings 工具:进入 clings 的 watch 模式后,每次保存文件会自动编译和验证。遇到卡壳时按 h 查看提示,按 l 浏览题目列表,按 t 查看测试用例(TDD 开发)。

  3. 重视指针与内存:本阶段是指针的"入门关"。从 Lesson 16 的 strcpy 开始,到 Lesson 18 的 va_list 可变参数,再到 Lesson 19 的函数指针——每一步都在深化对内存模型的理解。务必动手画内存图。

  4. 思考"状态机思维":Lesson 17(单词计数)、Lesson 19(shell 解析)、Lesson 20(去注释/宏展开)、Lesson 21(词法分析)四个练习构成了"状态机四连击"。学会用"当前状态 + 输入 → 新状态"的方式组织代码,是后续编译器和系统编程的核心技能。

  5. 动手做综合项目:Lesson 18(myprintf)、Lesson 19(shell)、Lesson 23(五子棋)、Lesson 24(搜索引擎)是本阶段的四个综合项目。它们各需 20-50 行代码,综合运用函数、指针、结构体、状态机等多项技能,完成后会极大提升编程自信心。

  6. 按时参加直播:本阶段有两节腾讯会议直播课(06/29 和 07/01),建议按时参加以获得最佳学习效果。直播中会现场演示代码编写过程,并解答疑问。如无法参加,请务必在课后观看回放。

五、关于晋级与要求

晋级方式

  1. Fork 训练营的 Unit-1-C-Fundamentals 仓库,在云原生开发环境或本地环境中完成 40 道练习题。
  2. 提交代码到 main 分支并创建合并请求(PR),CI 系统会自动评分。
  3. 可多次提交,以最高分为准。通过后即可在 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 0C Primer5 课 / 9 题最简程序、printf、循环、条件分支、累加求和

从"编辑 — 编译 — 运行"的全流程入手,通过 5 个最小可运行程序建立 C 语言的基本心智模型。使用 clings 工具交互式练习。

基础阶段

Unit名称课程数核心内容
Unit 1C Fundamentals19 课 / 40 题嵌套循环、函数、数组、指针、结构体、联合体、位运算、可变参数、预处理器、状态机

从九九乘法表到词法分析器,涵盖 C 语言核心语法特性。通过实现 printf、命令解释器、预处理器、词法分析器等项目,将语法知识转化为工程能力。

进阶阶段

Unit名称课程数核心内容
Unit 2C Essentials24 课链表、栈、队列、树、堆、散列表、排序、查找、递归、动态规划

系统学习经典数据结构与算法,从文件操作(cp/sed/ELF 解析)到命令行工具(计算器/sort/ls/MyBash),最终完成地图导航综合项目。

专业阶段

Unit名称课程数核心内容
Unit 3C Classicals24 课哲学家就餐、停等协议、LL(1) 解析器、B+ 树、光线追踪、A*寻路、RSA、向量时钟、缓存模拟、Aho-Corasick、NFA→DFA、测试框架、缓冲区溢出、感知机、LU 分解、无锁环形缓冲、标记清除 GC、图灵机、FFT、Sobel 边缘检测、TF-IDF、量子比特、PoW 区块链、终端计算器

覆盖计算机科学 17 个子领域的经典问题,每题平均编写约 96 行 C 代码,为编译器项目建立广阔的 CS 视野。

项目阶段

完成前三个阶段后,进入双线并行的项目实践:

Unit名称课程数核心内容
Unit 4C Compiler24 课从零实现 C 编译器 nccl-cc:一棵 AST,四个后端,五个运行环境
Unit 5C Kernel24 课从零实现操作系统内核 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、在多核处理器上并行调度的完整操作系统。

Released under the MIT License.