##### 整体认识
```c
#include <stdio.h>
int main()
{
/* 我的第一个 C 程序 */
printf("hello, world\n");
return 0;
}
```
- 整体认识
- `#include <stdio.h>` 是[[C.预处理器|预处理器指令]] [[C.include|include]], 它告诉[[C.编译器|编译器]]在实际编译之前要包含的[[C.头文件|头文件]], 其中 `stdio.h` 是[[C.标准库|标准库]]中的标准输入输出库 [[C.stdio.h|stdio]], 这个库提供了一组[[C.函数|函数]], 用于处理输入和输出操作, 如读取输入, 打印输出, 文件操作等
- `main()` 是[[C.主函数|主函数]], 程序的入口点, `int` 表示主函数返回一个[[C.整数|整数]], 后面紧跟着的 `{}` 表示函数体[[C.复合语句|复合语句]], 其中含有两个单独的[[C.语句|语句]]. 这些内容一起是函数定义
- `/* 我的第一个 C 程序 */` 为程序[[C.注释|注释]], 不会被运行
- `printf()` 是标准输入输出库中的函数 [[C.int printf()|printf]], 用于输出格式化的字符串, 将字符串 `"hello, world\n"` 输出到屏幕, 其中 `\n` 是换行符, 函数调用为[[C.表达式语句|表达式语句]]
- `return 0` 终止主函数, 并返回值 0 , 此为[[C.return 语句|return 语句]]
- `;` 分号表示语句结束
- 基本概念
- C 程序是一系列文本文件, 通常是头文件和源文件, 它们包含一些声明. 它们会经过翻译变成可执行程序, 在操作系统调用其主函数时被执行
- 某些词在 C 程序中拥有特别含义, 它们是关键词. 其他词可用做标识符, 可用于标识对象, 函数, 结构体, 联合体或枚举的标签, 它们的成员, typedef 名, 标号, 或者宏
- 每个标识符, 除了宏, 仅在程序的一部分中合法, 这部分被称为它的作用域, 并属于四种命名空间之一. 一些标识符拥有链接, 这会令它们出现于不同作用域或翻译单元时, 指代同一实体
- 函数的定义包含一系列语句和声明, 其中有的包含表达式, 它指定程序要进行的计算
- 声明和表达式创建, 销毁, 访问并操作对象. C 中的每个对象, 函数及表达式均关联到一种类型
- 程序编译与执行
- 代码源文件 `hello.c` 编写完成后将被编译
- 文件编译之前首先会被预处理, 预处理器将删除代码中的所有注释, 扩展所有宏和头文件, 替换文本, 最后输出 `hello.i`
- 然后通过编译器被转换为汇编代码, 汇编是一种每个CPU都能理解的低级编程语言, 最后输出 `hello.s`
- 然后将其转换为称为目标文件的二进制代码, 大部分代码将被转换为 0 和 1, 并输出一个 `hello.o` 文件
- 最后如果程序使用外部函数, 则链接器解析对这些函数的引用, 它将目标文件链接在一起并创建可执行文件 `hello.exe`
- 当可执行文件运行时, 操作系统的加载器将程序加载到内存中, 加载器为程序的代码, 数据和堆栈分配内存
- 全局变量和静态变量被初始化, 如果有任何初始化代码, 就会执行它
- 调用主函数, 开始执行程序, 指令按顺序执行, 函数调用和控制流改变执行流程
- 一旦主函数返回, 程序终止, 返回值被传回操作系统, 指示程序的退出状态