前言
本系列教程主打简单易懂,会尽量减少专业名词,多用故事、实例来讲解 C 语言的逻辑。我会把 C 语言知识点拆分成一篇篇独立文章,而非按传统章节划分。每篇内容相互独立,如果你已经掌握了某个知识点,可以直接跳过对应文章。
什么是c语言
c语言是一种计算机语言,就像我们和外国人对话要学英语法语等语言一样,我们和计算机对话就要学c语言。很多时候我们可以看到有些人将c语言称为高级语言,那什么是高级语言呢?什么是汇编语言呢?什么是机器语言?
怎么更好地理解高级语言、汇编语言和机器语言?举个例子:有一天,你想向外国友人表达及时补救、为时未晚的意思,脱口而出 “亡羊补牢”。翻译会先将其解读为 “遭受损失后采取补救措施”,再翻译成 “Take remedial measures after suffering a loss” 传达给对方。其中你所说的成语 “亡羊补牢”,可以看作高级语言(C 语言),表达精练易懂;翻译的解读过程相当于汇编语言;最终的英文则对应机器语言。相信大家也能发现,翻译的解读方式并非唯一,也可以将其理解为 “改过不嫌晚”,再翻译成更简洁地道的 “It's never too late to mend”。因此我们编写的 C 语言代码,可能会被编译成不同的机器语言,但无需担心,它们表达的含义与执行效果通常是一致的。
现实生活中我们和外国友人交流需要一个翻译软件,那么C语言程序是怎么让计算机知道我们在表达什么呢?这里引入C语言的编译过程
这里有三种不同后缀的文件,其中源程序就像是我们写给计算机的信,而编译和链接的过程,就相当于对这封信进行解读与翻译,最终生成的可执行文件,就是翻译完成后、计算机能够直接读懂的信件。当然其中编译和链接是由独立的工具实现的。
编译器是把程序员写的 C 语言(或其他高级语言)源代码,翻译成计算机能直接识别、执行的机器码(0 和 1 的二进制指令)的专用程序,它会把c语言源码一次性翻译成完整的可执行文件后续运行这个程序时,不需要编译器参与。(比如 Windows 下的.exe,单片机中的.bin)
链接器是编译器的核心组成部分之一,负责将编译生成的目标文件和库文件、启动代码等组合为可执行文件。其中目标文件(.o/.obj)** 只是零散的机器码片段,既没法独立运行,还依赖C 标准库 / 第三方库(库文件)的现成代码,比如遇到成语需要查字典进行注释,而库就相当于字典,链接器的工作就相当于翻译员在翻译的过程中查字典,并将字典中内容进行注释的过程。
每个语言都有自己的标准化,c语言也不例外,在学习和使用c语言的时候,大家可能经常听C89、C90、C99、C11,这些标准对 C语言的语法、库函数等做出了明确的规定,而标准库和第三方库就如同我们使用的字典一样,在成语字典中找想用的成语,也可以在C89库中找自己需要的库函数。而C89、C90、C99、C11这四个只是不同的版本,用那个版本一般看项目需要那个版本,然后到对应版本下的库里找需要的函数即可。