-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path01-hello-world.c
87 lines (84 loc) · 4.06 KB
/
01-hello-world.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/**
* 01. Hello World 入门示例
* ============================================================================
* 最简单的 c 程序,在控制台输出 Hello World 字符。运行命令:
* > gcc 01-hello-world.c && ./a.exe
*
* Hello World 示例展示了 c 语言的基础语法与结构,如预处理器,函数,数据类型,以及
* 一些约定俗成的规则。
*/
/**
* 预处理器指令 #include
* ============================================================================
* Preprocessor 预处理器用来告诉 compiler 编译器该干什么,指明一些编译规则,最常用的
* 两个指令是 #include 文件包含和 #define 宏替换。
*
* #include 指明编译时应该包含哪些 .c 文件。这是一个模块化功能,成熟的项目一般都会
* 分成很多小模块,这样多人协作的时候每个人只需要维护自己的模块即可。
*
* #include 实际上是将该行替换为该文件的内容,包含的文件可以是空的,这样替换后的这行
* 也一样是空的,也可以是一些 .txt 文本文件,那这行替换后就是一样的文本内容,只要
* 符合 c 语言的语法,就可以通过正常编译与运行。
*
* 最佳实践,也就是通常情况下,#include 包含的是一些 header 头文件。头文件里是一些
* 抽象的类型声明,非具体实现代码,通常是以 .h 作为文件后缀名。
*/
#include <stdio.h>
/**
* 标准库头文件 stdio.h
* ============================================================================
* 标准库里定义了一些常用的函数和宏,是 c 语言的一部分。多年来 c 语言的发展经过了多次
* 修订,标准库就是由这些 c standards 定义的。
*
* 1999 年修订的 C99 是应用最为广泛的,建议熟悉里面的标准库。现行的 c 语言标准
* 是 C17,新增了几个标准库。C 语言标准需要编译器支持,不支持的 c 语言标准可能会编译
* 错误。
*
* @see https://en.wikipedia.org/wiki/C_standard
*
* 标准库 <stdio.h> 里定义了基本的 I/O 输入/输出功能,主要有文件操作和格式化的标准输入
* 输出(控制台)。
*
* 下面使用的 printf() 就是这个库中定义的一个函数,如果未引入标准库头文件,编译就会
* 出错,因为此函数未声明,编译器不知道它是什么。printf() 用来格式化输出到 stdout 标准
* 输出上,一般是控制台。
*
* 使用 printf("%ld", __STDC_VERSION__) 可以查看当前编译器使用的 c 语言标准。
*/
/**
* 主体函数声明 main()
* ============================================================================
* 程序一般都有 entry point 执行入口,用 c/c++ 语言编译的程序执行入口是 main() 函数。
* 有些语言没有执行入口的概念,拿 nodejs 举例来说,就是直接把整个文件加载编译成一个
* 函数,接着提供给 V8 执行,这样的语言在底层默认处理了。没有执行入口的语言有一个缺点:
* 全局变量,比如 nodejs 中的 __filename, process 等。
*
* 为什么函数名是 main ?
*
* 众所周知,c 语言编译后的是汇编 assembly output (文件名简写 a.out 由来)。而汇编
* 语言里全是些指令,看起来就像这样:
*
* ;; pseudo-assembly-language
* ;; main(argc, argv); call
* PUSH argv
* PUSH argc
* CALL main ;; 执行入口
* POP ;; caller cleans up
* POP
*
* @see https://stackoverflow.com/questions/19419569/how-does-the-main-method-work-in-c
*
* 注:C 语言里函数不能嵌套。
*/
int main() {
printf("Hello World\n");
return 0;
// 返回类型与函数开头类型声明相对应
}
/**
* 程序退出状态
* ============================================================================
* 在 main() 函数里返回一个数值可指明运行状态,如果为 0 表示成功,其它值为运行失败。
*
* 在 unix 系统里 $? 符号表示上一个程序的运行状态。
*/