在开始编程之前
潜入 C 语言的茫茫深海之前,请容许我做个开场白。
我是个想用平凡的心做出不平凡的事的计算机爱好者,大家可以叫我 mdr。我不学计算机专业,所以大家别担心我会和你们抢饭碗。
编写这部教程的理由很简单,对现实的不满,对改变现状的渴望;它的目标也很简单,让更多的人在这里有所收获。
要想了解更多关于本教程的信息,请前往关于页面。
你不用学一辈子 C 语言,但我们可以做一辈子朋友。
OK,我们开始。这一章的内容很轻松,就当闲聊了。
1. 什么是编程
1.1 定义
1.2 编程的两个起源
- 两个计算模型:图灵机 (Turing Machine) 和 lambda 演算 (Lambda-calculus)
- 命令式编程 (Imperative Programming) 和函数式编程 (Functional Programming)
1.3 编程语言 (Programming Language)
- 编译型 (Compiled) 语言和解释型 (Interpreted) 语言
- 主流编程语言
1.4 学习编程必需的能力
搜索引擎的使用:主流搜索引擎见 2.3 使用搜索引擎查找资料;
寻找官方网站,注册账号,与下载正版软件的能力;
基本的英语水平,要理解报错信息的内容;
合理提出问题的能力,详见编程交流群生存指南;
理解语言的能力:
- 编程语言是人写的,也是给人看的,编程语言当中有自然语言的影子;
- 把你的代码写得更像自然语言,就能自然地契合“如无必要,勿添注释”的思想;
- 函数的名称有意义,了解这些名称(的词源)有助于记忆函数的功能,也方便在正确的使用场景想起特定函数。
2. 如何学习编程
真正的底层是“语义”,而非实现
很多初学者认为,“底层”就是指那些跟硬件打交道的东西,比如汇编和操作系统。这没错,但它不是学习的起点。
对于学习者而言,真正的“底层”是语言的“语义”(Semantics)——即一个特性“是什么”以及它“承诺遵守的规则”。
- 语义(你要先掌握的):比如,
union
这个关键字,它的规则是“所有成员共享一块内存,同一时间只有一个有效”。这是它的核心身份,是它不变的承诺。 - 实现(你可以后探索的):这块内存具体是如何对齐的,在不同编译器下有什么差异。这是它具体的“建造方式”。
2. 掌握语言的“成语”与“套路”(Idioms)
每门编程语言都有一些约定俗成的、用于高效解决特定问题的最佳实践,我们称之为“套路”或“惯用法”(Idioms)。
以循环为例:
for
和while
都能实现循环。但它们的“套路”完全不同。for
的套路:用于已知次数的迭代。当你看到一个数组,想对它从头到尾进行操作,你的大脑里应该自动浮现出for (int i = 0; i < n; i++)
这个标准句式。它结构紧凑,意图清晰——“我要对这个序列做N次事”。while
的套路:用于未知次数、依赖某个条件才能结束的迭代。比如读取文件直到末尾,或等待用户输入特定指令。它的句式while (condition)
完美地表达了“只要条件满足,就一直做”的意图。
先学语义,后探索套路,必要时了解实现。
3. 如何学习这些“套路”?——从观摩大师开始
这么重要的‘套路’,为什么书上很少系统地教?
这是一个极好的问题。因为“套路”源于实践,它存在于鲜活的代码和程序员社区中。教科书能给你地图,但真正的驾驶技巧要在路上学。
那么,去哪里学?走出书本,去代码的世界里“观摩”和“实践”。
- 看各种代码片段(Snippets):主动寻找和阅读解决小问题的优秀代码。
- 使用在线编程平台(如Codewars):这些平台是学习“套路”的绝佳健身房。
- 遵循最高效的学习回路:
- 第一步:自己动手。用你当前学会的知识,努力解决一个问题。
- 第二步:观摩高手。提交你的答案后,去看别人的解决方案,特别是那些被高票点赞的。
- 第三步:对比反思。你会震惊地发现:“原来这个问题还能这么写!”“原来这个函数还能这么用!”
- 第四步:吸收内化。在巨大的差距和顿悟中,你就能最高效地吸收新的“套路”,并把它变成你自己的武器。
你的目标,是在更高的抽象层次上思考:通过掌握一个个“套路”,将解决问题的步骤打包成可以直接调用的“模式”。
3. 关于 C
3.1 发展历史
- 机器码
- 汇编
- ALGOL CPL BCPL
- C
3.2 标准
- 事实标准:K&R C
- ANSI C(被 ISO 采纳)
- 从 C89 到 C23(建议大家有空了看看标准)
- 未来的 C2y(如果有精力和能力,可以关注最新的草案,了解新标准的制定进程)
3.3 应用领域
- 系统编程:操作系统 (Operating System, OS),编译器 (Compiler),数据库 (Database, DB) 等
- 嵌入式开发,物联网 (Internet of Things, IoT)
- 网络编程
- 图形图像处理
3.4 推荐网站
- C++ 参考手册 学习 C 和 C++ 必备网站(注:C 和 C++ 是不同的编程语言;这个网站虽然名字中带 C++,但是其中也有 C 语言的内容,阅读这部分内容即可)
- Compiler Explorer 在线编译器,支持生成汇编等多项功能,支持非常多的语言和多种编译器
- Codewars 偏实际应用的题目,注重语言特性和实践,需要登录后使用;成功解题之后可以看到所有人的解题方法并进行评价
登录后初始化账号,鼠标移动到左边打开侧边栏,点击 practice
3.5 推荐的 C 书籍
C 程序设计语言 第 2 版
C 语言之父力作,第一推荐;
C Primer Plus 第六版(中文版)
C 语言的经典教材,但是有些地方表述有误或者不合适,第二推荐。 习题答案暂时见这里
3.6 关于 C 语言标准文档
有且只有标准文档,规定了一门语言是什么。如果有精力和能力,可以阅读 C 语言标准,上面不仅有语言规则的定义,还有丰富的示例代码。标准文档的专业性很强,不适合作为初学者的入门读物。
各版本 C 语言标准文档获取如下:
- 点开 C++ Reference
- 向下翻,找到 C 参考手册的外部链接
- C 语言及库参考中的
.pdf
就是标准文档,编号(n 后面的数)越大越新
4. 开发工具
4.1 编译器
- GCC
- Clang
- MSVC
4.2 编辑器 (Compiler) 和 集成开发环境 (Integrated Development Environment, IDE)
别弄混代码编辑器 (Editor) 和编译器。
轻量编辑器 VS Code(Visual Studio Code,简称 VSC)是一款开源,生态丰富的编辑器,但是用它写 C 需要配环境,因此对新手有一些不友好。如果你有 Python / JavaScript / TypeScript 的开发需求,它是你的不二之选(是的,笔者认为体验优于 PyCharm 和 WebStorm)。
如果官网下载特别慢的话,复制下载链接,把链接中的
az764295.vo.msecnd.net
换成vscode.cdn.azure.cn
;普遍应用于 Linux 的开源编辑器 Vim;
什么是 IDE(Integrated Development Environment)
JetBrains CLion:非商业用途可以免费使用。
可以在官网或 JetBrains Toolbox App 下载
在线 IDE Lightly
Visual Studio(简称 VS)是一款及其强大和现代的 IDE,尤其适合 .Net 开发;但由于某些奇怪的设定,以及 MSVC 对 C 的支持有限(不支持某些 C99 特性,不支持绝大多数 C23 特性),VS 不适合用于初学 C 语言。
4.3 CMake 和 XMake
在项目案例模块中,我们会讲解一些关于构建系统的知识。
4.4 debugger
IDE 一般会自带 debugger。
5. 学习编程的方法和建议
5.1 多敲代码
- 实践是检验真理的唯一标准
- 敲过才算学过
5.2 学会看报错,看日志文件 (Log)
可以把报错发给 AI 看。😃
5.3 使用搜索引擎 (Search Engine) 查找资料
5.4 博客
可以发博客分享自己的心得或提出自己的疑问。但 CSDN 这种地方还是少逛为妙。
5.5 学会使用 GitHub
GitHub 是世界上最大的代码托管网站,上面有大量优秀的开源项目。
6. 关于一些别的东西
6.1 关于人工智能 (Artificial Intelligence, AI)
特指
人工智能这个词涵盖的领域非常广,但本网站中,它专指大语言模型 (Large Language Model, LLM)。
了解一下 Prompt Engineering 和 MCP。
目前主流的大语言模型在幻觉问题上已经有了很大改善,辅助一些比较简单的内容的学习时(几乎)不会胡编乱造,可以放心大胆地提问。
截至目前(注:2025.8.4),主流的大语言模型提供商有如下几个:
- 国外:
OpenAI:GPT 系列和 o 系列,免费用户只能体验有限功能;Plus 订阅每个月 20$,Pro 订阅每个月 200$。
Google:Gemini 系列,免费用户在官网上的使用次数受限;在 Google AI Studio 上可以免费使用。
Anthropic:Claude 系列,官网注册需要国外手机号,免费用户只能体验有限功能。在某些 AI 编辑器中可以直接使用。
Anthropic 还推出了终端编程助手 Claude Code,Pro 用户使用额度较少,Max 用户额度较多。充 Max 一定要充每个月 200 美元的。
xAI:Grok系列,自 Grok 4 起,只有付费用户才能在官网使用。
- 国产:
在 Poe 上充值(每天有免费额度)后,可以使用上述所有模型。
在硅基流动上,可以体验所有的开源模型。收费。新用户会赠送 14 元余额,通过学生认证后会额外赠送 50 元余额。
6.2 关于编程交流群
详见 编程交流群生存指南
6.3 关于手册 (Manual) 和标准文档
自然语言是注释,代码更重要。
6.4 关于黑子
C 有很多值得黑的地方,不过黑的话要拿出证据来(当然这些证据也俯拾即是)。
INFO
瑕不掩瑜,C 语言的优点比缺点多很多。
- C Primer Plus
6.5 关于 C++
C++ 是一门更复杂的编程语言。关于它的讨论超出了本教程的范围。
但你可以通过以下书籍学习 C++:
- Bjarne Stroustrup 的 C++ 程序设计:原理与实践(最推荐)
- Bjarne Stroustrup 的 The C++ Programming Language(偏工具书)
- M. Lippman 的 C++ Primer(偏工具书)
在 C++ Reference 上可以找到 C++ 的全部语言特性和标准库功能。
6.6 emm
Talk is cheap, show me the code.
Code is cheap, show me the proof.
2
// Code is cheap, show me your nationality.
7. 推荐阅读或学习
- SICP (Structure and Interpretation of Computer Programs) 第二版(用 Scheme 写的那个版本)
- UML
- pl-docs
注:CS 自学指南 上面汇集了计算机各个领域的课程资料。
习题
关于习题
每道习题都有专属的五位数编号,一般写在题号之后,难度标注之前。点击该编号即可查看解析和答案。
由于题号限制,每一章最多设置 100 道习题。(这足够了!)因此,很多零碎的小题不单独作为一道习题出现,而是呈现为某道有特定情境或有概括性描述的较大型习题的若干个问。
为了致敬计算机科学家高德纳和他的不朽著作计算机程序设计艺术,梦猫大典采取和那部著作相似的题目难度标注方式。
不同的是,这里采用的格式是 [*.*]
(在本网站内用 斜体 标识),其中 *
是一个 0-9
的数字。第一个 *
表示难度等级,第二个 *
表示工作量。一般地,工作量为
难度前面如果加 M
,说明需要一定的数学知识(离散数学,微积分和线性代数等);如果加 HM
,说明需要远高于前者的数学知识(抽象代数,范畴论,微分几何等)。
难度后面如果加一颗 *
,表示不做此题几乎对当前章节的学习无影响;如果加两颗 **
,说明此题涉及当前章节之外(可能是成体系的)知识。
提示:每章节的习题难度不一定随编号单调递增。
- [10101] [0.2] 查找资料,了解高效使用搜索引擎的方法。
- [10102] [0.2] 熟悉键盘,知道如何打出下列符号:
+ - _ / | \ ' " : ; , . ? ! ( ) [ ] { } < > & # *
。 - [10103] [2.4] 在电脑上安装 C 语言开发所需的工具链和编辑器。
- [1.3*] 探索 Compiler Explorer,并了解其功能。
- [0.2*] 探索 C++ Refererence,并了解其功能。
- [3.5*] 了解编程语言的发展史和分类。