Skip to content

Commit fbabfa9

Browse files
committed
xxg
1 parent 8c64fa2 commit fbabfa9

File tree

11 files changed

+159
-71
lines changed

11 files changed

+159
-71
lines changed

docs/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ hero:
2424
link: /教程/标准文档翻译/目录
2525
- theme: alt
2626
text: 返回官网
27-
link: http://mdr.aymao.com
27+
link: http://mdr.juvw.xyz:2333
2828

2929
features:
3030
- title: 内容全面

docs/教程/正文/语法和标准库/10_预处理器/10_2_include.md

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
1. `include "文件名"`:搜索非实现控制下的文件
66
2. `include <文件名>`:搜索实现控制下的文件
77

8-
这个指令会把指定的文件内容“原封不动”地插入到当前文件中,就好像文件内容直接写在当前文件中一样。看下面的例子:
8+
在编写代码时,_1._ (永远)用于包含自己项目中的(自己写的或者第三方的)头文件,_2._ (永远)用于包含标准库的头文件。
9+
10+
这个指令会把指定的文件内容“原封不动”地插入到当前文件中,就好像文件内容直接写在当前文件中一样。看下面的例子(只为了展示,编写代码时永远不要包含 `.c` 文件):
911

1012
::: code-group
1113

@@ -29,6 +31,14 @@ int arr[10] = {
2931

3032
:::
3133

34+
::: error 永远不要 `#include` 任何 `.c` 文件
35+
36+
每个 `.c` 文件都会变成一个翻译单元,被编译成目标文件。`#include` 一个 `.c` 文件,相当于把它的所有代码(包括函数定义等)复制到了另一个 `.c` 文件中。如果你在项目中还有其他地方用到了被包含的那个 `.c` 文件,同一个函数或对象就会被定义两次,链接器在合并所有目标文件时就会发现冲突并报错。
37+
38+
所以,只应该包含头文件。头文件中不含定义。
39+
40+
:::
41+
3242
经过翻译阶段 4 的处理(代码中没有表现出翻译阶段 1~3 的处理)之后,`main.c` 文件会变成:
3343

3444
```c
@@ -73,7 +83,7 @@ int main() {
7383

7484
但不要这样做。阅读代码的人可能弄不明白 `arr.txt` 文件的内容;如果其中内容出现错误,编译时的报错会指向 `arr.c` 文件,加大了调试难度;如果 `arr.txt` 文件进行改动,比如增加了一个数,那么 `main.c` 文件中的 `arr` 数组声明就需要相应修改,增大了耦合性。
7585

76-
_如果数据确实保存在 `_.txt`当中,可以编写脚本程序,在编译时读取`txt`文件,生成含有`arr`数组定义的代码,再将该代码包含到`main.c` 文件中。
86+
如果数据确实保存在 `_.txt` 当中,可以编写脚本程序,在编译时读取 `txt`文件,生成含有 `arr` 数组定义的代码,再将该代码包含到 `main.c` 文件中。
7787

7888
:::
7989

@@ -317,4 +327,4 @@ flowchart TB
317327

318328
这样就防止了头文件的循环包含。
319329

320-
很多编译器实现了 `#pragma once` 指令,可以与上面的方法实现相同效果。
330+
很多编译器实现了 `#pragma once` 指令,可以与上面的方法实现相同效果。可以同时采用这两种方式。

docs/教程/正文/语法和标准库/1_在开始编程之前.md

Lines changed: 81 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,59 @@ OK,我们开始。这一章的内容很轻松,就当闲聊了。
2626
1. 编译型 (Compiled) 语言和解释型 (Interpreted) 语言
2727
2. 主流编程语言
2828

29-
## 2. 学习编程必需的能力
29+
### 1.4 学习编程必需的能力
3030

31-
1. 搜索引擎的使用:主流搜索引擎见 2.3 使用搜索引擎查找资料
32-
2. 寻找官方网站,注册账号,与下载正版软件的能力
33-
3. 基本的英语水平,要理解报错信息的内容
34-
4. 合理提出问题的能力,详见[编程交流群生存指南](/杂项/技术无关/1_编程交流群生存指南.md)
31+
1. **搜索引擎**的使用:主流搜索引擎见 2.3 使用搜索引擎查找资料
32+
2. 寻找**官方网站**,注册账号,与下载正版软件的能力
33+
3. 基本的英语水平,要理解**报错信息**的内容;
34+
4. 合理提出问题的能力,详见[编程交流群生存指南](/杂项/技术无关/1_编程交流群生存指南.md)
3535
5. 理解语言的能力:
3636

3737
1. 编程语言是人写的,也是给人看的,编程语言当中有自然语言的影子;
3838
2. 把你的代码写得更像自然语言,就能自然地契合“如无必要,勿添注释”的思想;
3939
3. 函数的名称有意义,了解这些名称(的词源)有助于记忆函数的功能,也方便在正确的使用场景想起特定函数。
4040

41+
## 2. 如何学习编程
42+
43+
### 真正的底层是“语义”,而非实现
44+
45+
很多初学者认为,“底层”就是指那些跟硬件打交道的东西,比如汇编和操作系统。这没错,但它不是学习的起点。
46+
47+
对于学习者而言,**真正的“底层”是语言的“语义”(Semantics)——即一个特性“是什么”以及它“承诺遵守的规则”。**
48+
49+
* **语义(你要先掌握的)**:比如,`union` 这个关键字,它的规则是“所有成员共享一块内存,同一时间只有一个有效”。这是它的核心身份,是它不变的承诺。
50+
* **实现(你可以后探索的)**:这块内存具体是如何对齐的,在不同编译器下有什么差异。这是它具体的“建造方式”。
51+
52+
### 2. 掌握语言的“成语”与“套路”(Idioms)
53+
54+
每门编程语言都有一些约定俗成的、用于高效解决特定问题的最佳实践,我们称之为“**套路**”或“**惯用法**”(Idioms)。
55+
56+
以循环为例:
57+
58+
* `for``while` 都能实现循环。但它们的“套路”完全不同。
59+
* **`for`的套路**:用于**已知次数**的迭代。当你看到一个数组,想对它从头到尾进行操作,你的大脑里应该自动浮现出 `for (int i = 0; i < n; i++)` 这个标准句式。它结构紧凑,意图清晰——“我要对这个序列做N次事”。
60+
* **`while`的套路**:用于**未知次数**、依赖某个条件才能结束的迭代。比如读取文件直到末尾,或等待用户输入特定指令。它的句式 `while (condition)` 完美地表达了“只要条件满足,就一直做”的意图。
61+
62+
先学**语义**,后探索**套路**,必要时了解实现。
63+
64+
### 3. 如何学习这些“套路”?——从观摩大师开始
65+
66+
这么重要的‘套路’,为什么书上很少系统地教?
67+
68+
这是一个极好的问题。因为“套路”源于实践,它存在于鲜活的代码和程序员社区中。教科书能给你地图,但真正的驾驶技巧要在路上学。
69+
70+
那么,去哪里学?走出书本,去代码的世界里“观摩”和“实践”。
71+
72+
1. **看各种代码片段(Snippets)**:主动寻找和阅读解决小问题的优秀代码。
73+
2. **使用在线编程平台(如Codewars)**:这些平台是学习“套路”的绝佳健身房。
74+
3. **遵循最高效的学习回路**
75+
* **第一步:自己动手**。用你当前学会的知识,努力解决一个问题。
76+
* **第二步:观摩高手**。提交你的答案后,去看别人的解决方案,特别是那些被高票点赞的。
77+
* **第三步:对比反思**。你会震惊地发现:“原来这个问题还能这么写!”“原来这个函数还能这么用!”
78+
* **第四步:吸收内化**。在巨大的差距和顿悟中,你就能最高效地吸收新的“套路”,并把它变成你自己的武器。
79+
80+
你的目标,是在更高的抽象层次上思考:通过掌握一个个“套路”,**将解决问题的步骤打包成可以直接调用的“模式”**
81+
4182
## 3. 关于 C
4283

4384
### 3.1 发展历史
@@ -49,16 +90,17 @@ OK,我们开始。这一章的内容很轻松,就当闲聊了。
4990

5091
### 3.2 标准
5192

52-
1. ANSI C(被 ISO 采纳)
53-
2. 从 C89 到 C23(建议大家有空了看看标准)
54-
3. 未来的 C2y(如果有精力和能力,可以关注最新的草案,了解新标准的制定进程)
93+
1. 事实标准:**K&R C**
94+
2. **ANSI C**(被 ISO 采纳)
95+
3.**C89****C23**(建议大家有空了看看标准)
96+
4. 未来的 C2y(如果有精力和能力,可以关注最新的草案,了解新标准的制定进程)
5597

5698
### 3.3 应用领域
5799

58-
1. 系统编程:操作系统 (Operating System, OS),编译器 (Compiler),数据库 (Database, DB) 等
59-
2. 嵌入式开发物联网 (Internet of Things, IoT)
60-
3. 网络编程
61-
4. 图形图像处理
100+
1. 系统编程:**操作系统** (Operating System, OS),**编译器** (Compiler),**数据库** (Database, DB) 等
101+
2. **嵌入式开发****物联网** (Internet of Things, IoT)
102+
3. **网络编程**
103+
4. **图形图像处理**
62104

63105
### 3.4 推荐网站
64106

@@ -68,18 +110,10 @@ OK,我们开始。这一章的内容很轻松,就当闲聊了。
68110
2. [**Compiler Explorer**](https://godbolt.org/)
69111
在线编译器,支持生成汇编等多项功能,支持非常多的语言和多种编译器
70112
![compiler explorer](/images/语法和标准库/1_在开始编程之前/002.png)
71-
3. [**牛客网(New Coder)**](https://www.newcoder.com/)
72-
大量练习题,**需要会员**
73-
![牛客网](/images/语法和标准库/1_在开始编程之前/003.png)
74-
点击**在线编程 - 语法篇 - C 语言入门**
75-
![在线编程](/images/语法和标准库/1_在开始编程之前/005.png)
76-
点击**专项练习 - 编程语言**,选择 **C 语言**
77-
![专项练习](/images/语法和标准库/1_在开始编程之前/004.png)
78-
4. [**Codewars**](https://www.codewars.com/)
79-
偏实际应用的题目,注重语言特性和实践,需要登录后使用
113+
3. [**Codewars**](https://www.codewars.com/)
114+
偏实际应用的题目,注重语言特性和实践,需要登录后使用;**成功解题之后可以看到所有人的解题方法并进行评价**
80115
![codewars](/images/语法和标准库/1_在开始编程之前/006.png)
81116
登录后初始化账号,鼠标移动到左边打开侧边栏,点击 **practice**
82-
![practice](/images/语法和标准库/1_在开始编程之前/007.png)
83117

84118
### 3.5 推荐的 C 书籍
85119

@@ -90,13 +124,26 @@ C 语言之父力作,第一推荐;
90124
C 语言的经典教材,但是有些地方表述有误或者不合适,第二推荐。
91125
习题答案暂时见[**这里**](https://github.com/Relph1119/c-primer-plus)
92126

127+
### 3.6 关于 C 语言标准文档
128+
129+
有且只有标准文档,规定了一门语言**是什么**。如果有精力和能力,可以阅读 C 语言标准,上面不仅有语言规则的定义,还有丰富的示例代码。标准文档的专业性很强,不适合作为初学者的入门读物。
130+
131+
各版本 C 语言标准文档获取如下:
132+
133+
1. 点开 [C++ Reference](https://zh.cppreference.com)
134+
![cppreference](/images/语法和标准库/1_在开始编程之前/008.png)
135+
2. 向下翻,找到 **C 参考手册****外部链接**
136+
![C 参考手册](/images/语法和标准库/1_在开始编程之前/009.png)
137+
3. **C 语言及库参考**中的 `.pdf` 就是标准文档,编号(n 后面的数)越大越新
138+
![C 语言及库参考](/images/语法和标准库/1_在开始编程之前/010.png)
139+
93140
## 4. 开发工具
94141

95142
### 4.1 编译器
96143

97144
1. GCC
98145
2. Clang
99-
3. MSVC(充话费送的)
146+
3. MSVC
100147

101148
### 4.2 编辑器 (Compiler) 和 集成开发环境 (Integrated Development Environment, IDE)
102149

@@ -164,19 +211,19 @@ IDE 一般会自带 debugger。
164211

165212
截至目前(注:2025.8.4),主流的大语言模型提供商有如下几个:
166213

167-
- 国外:
168-
- OpenAI:**GPT** 系列和 **o** 系列,免费用户只能体验有限功能。
169-
- Google:**Gemini** 系列,免费用户在官网上的使用次数受限;在 **Google AI Studio** 上可以免费使用。
170-
- Anthropic:**Claude** 系列,官网注册需要国外手机号,免费用户只能体验有限功能。在某些 AI 编辑器中可以直接使用。
214+
* 国外:
215+
* OpenAI:**GPT** 系列和 **o** 系列,免费用户只能体验有限功能;Plus 订阅每个月 20\$,Pro 订阅每个月 200\$
216+
* Google:**Gemini** 系列,免费用户在官网上的使用次数受限;在 **Google AI Studio** 上可以免费使用。
217+
* Anthropic:**Claude** 系列,官网注册需要国外手机号,免费用户只能体验有限功能。在某些 AI 编辑器中可以直接使用。
171218

172219
Anthropic 还推出了终端编程助手 [**Claude Code**](https://www.anthropic.com/claude-code),Pro 用户使用额度较少,Max 用户额度较多。充 Max 一定要充每个月 200 美元的。
173-
- xAI:**Grok**系列,自 Grok 4 起,只有付费用户才能在官网使用。
174-
- 国产:
175-
- DeepSeek:[官网](https://chat.deepseek.com/)免费使用。
176-
- Kimi:[官网](https://www.kimi.com/)免费使用。
177-
- 通义千问:[官网](https://chat.qwen.ai/)免费使用。
178-
- 质谱清言:[官网](https://chat.z.ai/)免费使用。
179-
- 豆包:不要用豆包写代码。太糖了。
220+
* xAI:**Grok**系列,自 Grok 4 起,只有付费用户才能在官网使用。
221+
* 国产:
222+
* DeepSeek:[官网](https://chat.deepseek.com/)免费使用。
223+
* Kimi:[官网](https://www.kimi.com/)免费使用。
224+
* 通义千问:[官网](https://chat.qwen.ai/)免费使用。
225+
* 质谱清言:[官网](https://chat.z.ai/)免费使用。
226+
* 豆包:不要用豆包写代码。太糖了。
180227

181228
[**Poe**](https://poe.com) 上充值(每天有免费额度)后,可以使用上述所有模型。
182229

@@ -233,19 +280,6 @@ Code is cheap, show me the proof.
233280

234281
注:[**CS 自学指南**](https://csdiy.wiki/CS%E5%AD%A6%E4%B9%A0%E8%A7%84%E5%88%92/) 上面汇集了计算机各个领域的课程资料。
235282

236-
## 8. 关于 C 语言标准文档
237-
238-
有且只有标准文档,规定了一门语言**是什么**。如果有精力和能力,可以阅读 C 语言标准,上面不仅有语言规则的定义,还有丰富的示例代码。标准文档的专业性很强,不适合作为初学者的入门读物。
239-
240-
各版本 C 语言标准文档获取如下:
241-
242-
1. 点开 [C++ Reference](https://zh.cppreference.com)
243-
![cppreference](/images/语法和标准库/1_在开始编程之前/008.png)
244-
2. 向下翻,找到 **C 参考手册****外部链接**
245-
![C 参考手册](/images/语法和标准库/1_在开始编程之前/009.png)
246-
3. **C 语言及库参考**中的 `.pdf` 就是标准文档,编号(n 后面的数)越大越新
247-
![C 语言及库参考](/images/语法和标准库/1_在开始编程之前/010.png)
248-
249283
## 习题
250284

251285
::: details 关于习题

docs/教程/正文/语法和标准库/2_一个简单的C程序.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,11 +219,23 @@ Program terminated with signal: SIGSEGV
219219
printf("%g\n", (double)a / b);
220220
```
221221

222-
第 16 行的 `(double)a / b` 中,a 和 b 都是整数类型:根据 C 语言的规则,把除法运算符应用到两个整数上,会得到一个整数结果(向零取整:`5 / 2` 等于 `2``-5 / 2` 等于 `-2`)。
222+
第 16 行的 `(double)a / b` 中,a 和 b 都是**整数类型**:根据 C 语言的规则,把除法运算符应用到两个整数上,会得到一个整数结果(向零取整:`5 / 2` 等于 `2``-5 / 2` 等于 `-2`)。
223223

224-
但当我们输入 `5 2` 时,我们希望程序输出 `2.5`,而不是 `2``(double)a` 表示将 `a` 强制转换为 `double` 类型,然后再进行除法运算。
224+
但当我们输入 `5 2` 时,我们希望程序输出 `2.5`,而不是 `2``(double)a` 表示将 `a` 强制转换为 `double` 类型(一种浮点数类型),然后再进行除法运算。根据**一般算术转换**的规则,浮点数除以整数结果会得到浮点数
225225

226226
## 习题
227227

228228
1. 创建 C 语言项目,把本章的示例代码复制进你的项目中,并且进行编译运行。
229229
2. 修改 `puts()` 函数中的内容,使得程序输出 `Hello, C!`
230+
3. _[1.2]_ 实验与观察:探索整数除法
231+
a. 暂时移除代码中的 `(double)` (强制类型转换),让除法变成 `a / b`
232+
b. 运行程序,分别输入 `5 2``6 3``-5 2`,观察并记录输出结果。
233+
c. 尝试解释为什么结果是这样。这是否验证了教程中关于“整数除法向零取整”的说法?
234+
4. _[1.2]_ 触发断言:理解 `assert`
235+
a. 运行原始程序,并在第二个整数输入 `0`
236+
b. 仔细阅读并尝试理解控制台输出的错误信息。它告诉你错误发生在哪一个文件的哪一行吗?它告诉你失败的条件是什么吗?
237+
5. _[1.3]_ 破坏与修复:理解 `#include`
238+
a. 将代码第一行的 `#include <stdio.h>` 的在行首加上 `//`
239+
b. 尝试编译程序。你看到了什么样的编译错误(Compiler Error)?错误信息是否提到了 `puts`
240+
c. 恢复 `#include <stdio.h>`,在 `#include <assert.h>` 的行首加上 `//`,再次编译。这次的错误信息又提到了什么?
241+
d. 通过这个实验,你能否总结出 `#include` 指令的作用是什么?

0 commit comments

Comments
 (0)