3. 基本概念
本章中,我们将会了解 C 语言中的一些概念。
可暂时跳过本章
这一节的内容较为繁杂,且几乎都是概念性内容,是未来深入理解 C 语言的基石。
如果你急于(这里是褒义词)上手写代码,可以先大致浏览每个标题,然后直接跳到后续章节。当你遇到不理解的术语或想弄清某个行为的“为什么”时,本章将是你随时可以回来查阅的参考手册。
在 C 语言程序中,我们可以留下一些只给人类读者看的笔记,编译器会完全忽略它们,这便是注释。我们已经在上一章的代码中见过它的身影。C 语言中有两种注释。
C 语言的对象并非指面向对象编程里的概念,而是指一块能存储数据的内存区域。这是 C 语言最核心的概念之一。对象的两个关键属性是它的类型和它的创建方式:类型决定了对象能存储什么样的数据以及能对它进行何种操作;而我们如何创建对象,并在一开始就给它赋一个初始值,则由 3.2.2 声明和初始化进行讲解。
一个 C 程序怎样才算“正确”?当代码“不正确”时又会发生什么?这引出了 C 语言的“法律体系”,其中包含了每个 C 程序员都必须敬畏的概念——未定义行为(Undefined Behavior, UB)。理解它,是写出健壮、可预测代码的前提,关于这些规则的详细探讨,请见 3.3 遵从性和行为。
从你写的 .c
源代码,到最终的可执行程序,中间经历了一系列精确定义的步骤。编译器实际处理的,并非单个的 .c
文件,而是经过预处理器处理(例如,将 #include
的头文件内容粘贴进来)后形成的翻译单元,这是编译器工作的基本单位。而从源代码到可执行程序的完整流程,则被标准划分为多个翻译阶段。
对象名、函数名、类型名,这些我们在程序中使用的名字,在 C 语言中统称为标识符。其中,有两个重要的子概念:首先,你需要知道有哪些名字是语言或标准库“保留”的,我们不应该使用它们来避免冲突,这些标识符被称作保留标识符;其次,你需要理解一个标识符在代码的哪个区域内是有效的,这便是作用域的概念,掌握它对于避免命名冲突和理解变量生命周期至关重要。
计算机的世界里只有数字。那么,'A'
这样的字符是如何存储和处理的呢?这需要一套编码标准将字符映射为数字。我们将介绍一种通用的标准:ASCII 码。
最后,从你写下代码到程序最终运行,整个过程发生在两个截然不同的“世界”里。C 语言标准将它们精确地定义为环境,包括翻译环境(Translation Environment)和执行环境(Execution Environment)。前者负责将你的源代码转换成可执行程序,后者则是程序真正运行的地方。根据执行环境提供的支持不同,又可分为提供完整标准库的宿主环境(Hosted)和功能受限的独立环境(Freestanding)。理解你的程序将要在何种环境中“翻译”和“执行”,是进行系统级编程和嵌入式开发的基础。
习题
本章没有习题。