Skip to content

Commit 6441a3a

Browse files
完善文档内容
1 parent bb29ef3 commit 6441a3a

7 files changed

Lines changed: 151 additions & 33 deletions

File tree

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ yarn-error.log*
2222
# draft
2323
draft
2424

25-
*table.py
25+
**/test

docs/docs/选择编程语言/C/0基础语法.mdx

Lines changed: 135 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,86 @@ sidebar_position: 0
33
title: 基础语法
44
---
55

6+
## 基础概念
7+
8+
### 编写代码
9+
10+
定义程序的目标、设计程序、编写代码是一个整理,有时,要在不同的步骤之间往复。
11+
12+
用C语言编写程序时,编写的内容被存储在文本文件中,该文件被称为<Highlight>源代码文件</Highlight>。通常以`.c`拓展名结尾。
13+
14+
### 编译与链接
15+
16+
C编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)​。
17+
18+
典型的C实现通过编译和链接两个步骤来完成这一过程。编译器把源代码转换成中间代码,链接器把中间代码和其他代码(启动代码和库代码)合并,生成可执行文件。
19+
20+
- 编译:C使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译的模块。通过这种方式,如果只更改某个模块,不必因此重新编译其他模块。
21+
22+
- 链接:另外,链接器还将你编写的程序和预编译的库代码合并。目标文件中存储的是编译器翻译的源代码,这还不是一个完整的程序。链接器的作用是,把你编写的目标代码、系统的标准启动代码和库代码这3部分合并成一个文件,即可执行文件。对于库代码,链接器只会把程序中要用到的库函数代码提取出来
23+
24+
有些系统中,必须分别运行编译程序和链接程序,而在另一些系统中,编译器会自动启动链接器,用户只需给出编译命令即可。
25+
26+
:::info
27+
这样的设计让一份C的源代码,在不同操作系统上通过对应的编译器编译,即可适配到特定的目标机器指令集上。
28+
29+
即:一次编写,处处编译。
30+
:::
31+
```mermaid
32+
graph TD
33+
%% 定义节点
34+
SourceCode["源代码<br/>(concrete.c)"]
35+
Compiler["编译器"]
36+
ObjectCode["目标代码<br/>(concrete.obj)"]
37+
LibraryCode["库代码"]
38+
StartUpCode["启动代码"]
39+
Linker["链接器"]
40+
Executable["可执行代码<br/>(concrete.exe)"]
41+
42+
%% 定义连接关系
43+
SourceCode --> Compiler
44+
Compiler --> ObjectCode
45+
ObjectCode --> Linker
46+
LibraryCode --> Linker
47+
StartUpCode --> Linker
48+
Linker --> Executable
49+
50+
%% 样式美化
51+
style Compiler fill:#ddd,stroke:#333
52+
style Linker fill:#ddd,stroke:#333
53+
style SourceCode fill:#fff,stroke:#333
54+
style ObjectCode fill:#fff,stroke:#333
55+
style Executable fill:#fff,stroke:#333
56+
```
57+
58+
UNIX系统提供的C编译器通常来自一些其他源,然后以cc命令作为编译器的别名。因此,虽然在不同的系统中会调用不同的编译器,但用户仍可以继续使用相同的命令。
59+
60+
编译inform.c,要输入以下命令: `cc inform.c` 等价于:`gcc inform.c`
61+
62+
```c showLineNumbers title="inform.c"
63+
#include <stdio.h>
64+
int main(void)
65+
{
66+
printf("C 语言程序的源代码文件以 .c 作为后缀。\n");
67+
68+
return 0;
69+
}
70+
```
71+
72+
如果使用ls命令列出文件,会发现有一个a.out文件​。该文件是包含已翻译(或已编译)程序的可执行文件。
73+
74+
要运行该文件,只需输入:`a.out`
75+
76+
:::tip
77+
如果要存储可执行文件(a.out)​,应该把它重命名。否则,该文件会被下一次编译程序时生成的新a.out文件替换。
78+
:::
79+
80+
:::info
81+
在该例中,目标代码文件是inform.o。然而,却找不到这个文件,因为一旦链接器生成了完整的可执行程序,就会将其删除。
82+
83+
如果原始程序有多个源代码文件,则保留目标代码文件。学到后面多文件程序时,你会明白到这样做的好处。
84+
:::
85+
686
## main函数
787
888
一个 C 语言程序**有且只有一个main函数**,程序运行时系统会**自动调用**。
@@ -15,10 +95,13 @@ title: 基础语法
1595
- `int` 代表函数执行之后会返回一个整数类型的值
1696
- `main` 代表这个函数的名字叫做 main
1797
- `()` 代表这是一个函数
18-
- `{}` 代表这个程序段的范围
98+
- `{}` 代表这个程序段的范围(花括号还可用于把函数中的多条语句合并为一个单元或块。)
1999
- `return 0;` 代表函数执行完之后返回整数 0
20100
21-
```c showLineNumbers
101+
```c showLineNumbers title="test.c"
102+
// test.c是完整的文件名
103+
// 其中test是文件名
104+
// .c 是C语言的文件拓展名。
22105
int main() {
23106
// insert code here...
24107
return 0;
@@ -27,7 +110,7 @@ int main() {
27110
:::info
28111
- C 语言中,每条完整的语句后面都必须以<Highlight>英文分号</Highlight>结尾
29112
- main 函数前面的 int 可以不写或换成 void
30-
- main 函数中的 return 0 可以不写
113+
- 养成在main()函数中保留return语句的好习惯。因为main 函数中的 return 0 可以不写
31114
:::
32115

33116
- 其它函数定义的格式
@@ -45,20 +128,36 @@ int call() {
45128

46129
:::info
47130

48-
- main函数会由系统自动调用, 其它函数需要开发者**在 main 函数中手动调用**
49-
- call 代表找到名称叫做 call 的某个东西
50-
- () 代表要找到的名称叫 call 的某个东西是一个函数
51-
- ; 代表调用函数的语句已经编写完成
52-
- 所以 `call();`代表找到 call 函数, 并执行 call 函数
131+
无论main()在程序文件中处于什么位置,所有的C程序都从main()开始执行。
53132

54-
```c showLineNumbers
55-
int call() {
56-
return 0;
133+
main函数会由系统自动调用, 其它函数需要开发者**在 main 函数中手动调用**
134+
135+
但是,C的惯例是把main()放在开头,因为它提供了程序的基本框架。
136+
137+
```c showLineNumbers title="two_func.c"
138+
/* two_func.c -- 一个文件中包含两个函数 */
139+
#include <stdio.h>
140+
// 第1个void表明,butler()函数没有返回值
141+
// 第2个void(butler(void)中的void)的意思是butler()函数不带参数
142+
void butler(void); /* ANSI/ISO C函数原型 */
143+
int main(void)
144+
{
145+
printf("I will summon the butler function.\n");
146+
butler();
147+
printf("Yes. Bring me some tea and writeable DVDs.\n");
148+
149+
return 0;
57150
}
58-
int main() {
59-
call();
151+
void butler(void) /* 函数定义开始 */
152+
{
153+
printf("You rang, sir?\n");
60154
}
61155
```
156+
butler()函数在程序中出现了3次。
157+
- 第1次是函数原型(prototype)​,告知编译器在程序中要使用该函数;
158+
- 第2次以函数调用(functioncall)的形式出现在main()中;
159+
- 最后一次出现在函数定义(functiondefinition)中,函数定义即是函数本身的源代码。
160+
62161
:::
63162
64163
## 注释
@@ -147,6 +246,25 @@ C语言的核心设计理念是<Highlight>小而精</Highlight>,它只提供
147246
- register: 寄存器存储类别
148247
- static: 静态存储类别
149248
- extern: 外部存储类别
249+
250+
### C99 性能优化与函数特性
251+
- inline:内联函数修饰符
252+
- restrict:用于指针的修饰符
253+
254+
### C99/C11 新增基础类型
255+
- _Bool: 布尔类型。
256+
- _Complex: 复数类型。
257+
- _Imaginary: 虚数类型。
258+
259+
### C11 内存对齐与并发处理
260+
- _Alignas: 设置变量或类型的内存对齐字节数。
261+
- _Alignof: 查询类型的内存对齐要求。
262+
- _Atomic: 原子操作修饰符,用于多线程并发。
263+
- _Thread_local: 声明线程局部变量。
264+
- _Static_assert: 静态断言(编译时检查)。
265+
- _Noreturn: 告诉编译器该函数不会返回(如调用了 exit 的函数)。
266+
- _Generic: 泛型选择表达式。
267+
150268
`} />
151269

152270
### 数据类型
@@ -425,7 +543,11 @@ C语言的核心设计理念是<Highlight>小而精</Highlight>,它只提供
425543
426544
`} />
427545

546+
:::info
547+
`#include <stdio.h>`作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。实际上,这是一种“拷贝-粘贴”的操作。
428548

549+
这行代码是一条C预处理器指令(preprocessor directive)​。通常,C编译器在编译前会对源代码做一些准备工作,即预处理(preprocessing)​。
550+
:::
429551

430552
## 运算符
431553

docs/docs/选择编程语言/C/1变量.mdx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,25 @@ title: 变量
99

1010
基本格式为 `变量类型 变量名称 ;`
1111

12-
- <Highlight>任何变量在使用之前,必须先进行定义, 只有定义了变量才会分配存储空间, 才有空间存储数据。</Highlight>
12+
- <Highlight>任何变量在使用之前,必须先进行声明, 只有声明了变量才会分配存储空间, 才有空间存储数据。</Highlight>
1313

1414
- <Highlight>一旦给变量指明了类型,那么这个变量就只能存储这种类型的数据</Highlight>
1515

1616
- <Highlight>变量名属于标识符,所以必须严格遵守标识符的命名原则</Highlight>
1717

18-
:::info
19-
一个 C 程序中可能会有多个函数和变量,为了区分这些函数和变量,就给他们起名, 这个名称就是标识符。标识符命名规则如下
18+
:::info 标识符
19+
一个 C 程序中可能会有多个函数和变量,为了区分这些函数和变量,就给他们起名, 这个名称就是<Highlight>标识符</Highlight>。标识符命名规则如下
2020

21-
- 只能由字母(`a~z``A~Z`)、数字、下划线组成
21+
- 推荐由字母(`a~z``A~Z`)、数字、下划线组成
22+
- C99 和 C11 的 UCN(通用字符名称,Universal Character Names)支持绝大多数现代语言字符作为标识符名。
2223
- 不能包含除下划线以外的其它特殊字符串
2324
- 不能以数字开头
2425
- 不能是 C 语言中的关键字
2526
- 标识符严格区分大小写, test 和 Test 是两个不同的标识符
2627
:::
2728

2829

29-
变量的第一次赋值,我们称为<HoverText text="初始化" explanation="不初始化里面存的可能是随机数,垃圾数据,系统正在用的一些数据" />
30+
变量的第一次<Highlight>赋值</Highlight>,我们称为<HoverText text="初始化" explanation="在执行int value;声明时,编译器在计算机内存中为变量value预留了空间,然后在执行这行赋值表达式语句时,把值存储在之前预留的位置。可以给value赋不同的值,这就是value之所以被称为变量(variable)的原因。不初始化里面存的可能是随机数,垃圾数据,系统正在用的一些数据" />
3031

3132
```c showLineNumbers
3233
// 先定义,后初始化
@@ -59,8 +60,6 @@ int b = a; // 相当于把a中存储的10拷贝了一份给b
5960
为了方便阅读代码, 习惯在 = 的两侧 各加上一个 空格
6061
:::
6162

62-
63-
6463
## 常量
6564

6665
定义**单个**常量有两种方式:`#define 常量名 常量值``const 数据类型 常量名 = 常量值;`
@@ -401,6 +400,7 @@ int main(){
401400
long long_num = 1234567890L;
402401
long long longlong_num = 1234567890123456789LL;
403402

403+
// %提醒程序,要在该处打印一个变量,d表明把变量作为十进制整数打印。
404404
printf("short: %hd\n", short_num); // 12345
405405
printf("int: %d\n", int_num); // 123456
406406
printf("long: %ld\n", long_num); // 1234567890

docs/docs/选择编程语言/C/2数据.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ C语言有5种基本数据类型:`char`、`int`、`float`、`double`、`void`
3737

3838
char 用于存储一个基本的 ASCII 字符(不可以存储中文)。
3939

40-
ASCII 码表很小,只包含大小写字母、数字、标点、打印机用的换行、换页等符号
40+
ASCII 码表很小,只包含大小写字母、数字、标点。及打印机用的换行、换页、退格等符号(<Highlight>转义字符</Highlight>)
4141

4242
- 用<Highlight>单引号</Highlight>括起来的<Highlight>单个</Highlight>ASCII 码表字符: `'A'`, `'1'`, `'$'`, `'\n'`
4343

docs/docs/选择编程语言/C/5控制流.mdx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,6 @@ sidebar_position: 5
33
title: 控制流
44
---
55

6-
为了方便我们控制程序的运行流程,C 语言提供 3 种流程控制结构,不同的流程控制结构可以实现不同的运行流程。
7-
8-
- 顺序结构:按书写顺序从上至下依次执行
9-
- 选择结构:对给定的条件进行判断,再根据判断结果来决定执行代码
10-
- 循环结构:在给定条件成立的情况下,反复执行某一段代码
11-
12-
136
## 选择结构
147

158
- C 语言中提供了两大选择结构,分别是 if 和 switch
@@ -401,7 +394,8 @@ int main() {
401394
}
402395
```
403396

404-
- switch 中只要任意一个 case 匹配,其它所有的 case 和 default 都会失效。所以如果 case 和 default 后面没有 break 就会出现穿透问题
397+
- switch 中只要任意一个 case 匹配,其它所有的 case 和 default 都会失效。程序将无条件地继续执行后续所有 case 或 default 分支中的代码,直到遇到 break 或整个 switch 块结束为止。
398+
- 所以如果 case 和 default 后面没有 break 就会出现穿透问题
405399

406400
```c showLineNumbers
407401
#include <stdio.h>

docs/docs/选择编程语言/C/index.mdx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ title: C语言基础
55

66
## C与C++
77

8-
在很大程度上,C++是C的超集,这意味着一个有效的C程序也是一个有效的C++程序。
8+
C++几乎是C的超集,这意味着一个有效的C程序也是一个有效的C++程序。同时学习C的过程也会理解大部分C++的知识
99

1010
C和C++的主要区别是,C++支持许多附加特性。但是,C++中有许多规则与C稍有不同。
1111

@@ -99,4 +99,5 @@ gdb --version
9999
- 推荐颜色主题:Dark Modern
100100
- 推荐图标主题:office material
101101
- 推荐字体:Fira Code(可选连字符显示)
102-
- Cursor侧边栏方向修改:`workbench.activityBar.orientation`,改为`vertical`
102+
- Cursor侧边栏方向修改:`workbench.activityBar.orientation`,改为`vertical`
103+

docs/docs/选择编程语言/Python/index.mdx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,9 +399,10 @@ function\s+(\w+) ## 匹配函数定义
399399
| 操作类型 | 功能 | 快捷键 |
400400
|----------|------|--------|
401401
| **创建多光标** | 按住Alt点击 | 在任意位置添加光标 |
402+
| | 在选中区域每行末尾添加光标 | `Alt + Shift + I` |
403+
| | 在选中区域每行开头添加光标 | `Alt + Shift + I , Home` |
402404
| | 选择下一个相同单词 | `Ctrl + D` |
403405
| | 选择所有相同单词 | `Ctrl + Shift + L` |
404-
| | 在选中区域每行末尾添加光标 | `Alt + Shift + I` |
405406
| **列选择模式** | 矩形选择 | `Shift + Alt + 鼠标拖拽` |
406407
| | 向下/上扩展列选择 | `Ctrl + Shift + Alt + ↓/↑` |
407408
| | 向左/右扩展列选择 | `Ctrl + Shift + Alt + ←/→` |

0 commit comments

Comments
 (0)