写在前面:
学习的高效之道是先搭框架,明确事物是什么、从哪来、有何用,再填细节。学C语言亦如此,先建立其定位、演变、应用与优劣的整体认知,再学具体语法,方能高效扎实掌握。
1.什么是C语言
C语言是一门通用的计算机语言,广泛的应用于底层开发。(当然,C语言也可以用于上层软件的开发,例如WPS就是用C开发的。)
1.1.C语言的核心特性:
(1)兼具高级语言的便捷性与低级语言的灵活性
-
-
- C语言具有高级语言的结构化语法(顺序、选择、循环结构)、函数封装等便捷特性;
- 同时支持指针操作、内存直接寻址等底层能力,能够直接与计算机硬件交互。
-
(2)高效性(执行效率高、内存占用少)
-
-
- C语言编译后生成的是接近机器指令的目标代码,无需虚拟机解释执行,执行速度极快;
- 同时我们可以按照规划直接操作内存,包括申请、使用、释放等,经过合理的规划,可以极大地提高内存利用率,这是底层开发的关键要求。
-
(3)可移植性强
-
-
- 标准C语言(ANSI C/ISO C)的语法标准和库函数在不同的操作系统(win、Linux、Unix)和硬件架构(X86、ARM)上具有高度一致性,仅需要少量修改(甚至无需修改),即可在不同的平台编译运行。
-
(4)功能强大且简洁
-
-
- C语言语法简洁精炼,关键字数量少,但支持位运算、结构体、枚举、位段等丰富特性,能够满足复杂的底层逻辑开发的需求
-
tips:
C语言是有国际标准的,有无国际标准也是衡量一门计算机语言是否优秀的标准之一。
1.2.C 语言底层开发的应用场景
(1)操作系统内核开发:
几乎所有主流操作系统的内核核心部分都是用 C 语言编写的,例如 Linux 内核、Unix 内核、Windows 内核的底层模块。操作系统需要直接管理 CPU、内存、磁盘等硬件资源,C 语言的高效性和硬件交互能力是首选。
(2)嵌入式系统开发:
单片机(51、STM32)、物联网设备(ESP32、树莓派底层)、智能硬件(智能手表、智能家居控制器)等嵌入式设备的程序开发,绝大多数以 C 语言为核心。这些设备通常内存小、性能有限,对程序的体积和效率要求严苛,C 语言是最佳选择。
(3)驱动程序开发:
硬件设备(显卡、声卡、网卡、打印机等)的驱动程序,需要在操作系统和硬件之间建立通信桥梁,直接操作硬件寄存器和内存,必须通过 C 语言实现。
(4)底层工具 / 中间件开发:
编译器(如 GCC)、汇编器、调试器等开发工具,以及数据库底层引擎(MySQL 底层)、网络协议栈(TCP/IP 协议栈实现)等中间件,都依赖 C 语言的高效性和底层操控能力。
(5)高性能服务端底层:
部分高并发、高吞吐的服务端程序(如 Web 服务器 Nginx 的核心模块),为了追求极致性能,其底层核心逻辑也会采用 C 语言开发。
当然,对于服务端,应用更广泛的是Java、Python等开发效率更高的语言。
2.C语言的演变
2.1.二进制语言(机器语言)
二进制语言是计算机唯一能识别和执行的语言,由0和1组成的二进制代码串,每一串二进制对应一条机器指令。
(1)存在的问题:
-
-
- 可读性极差
- 难以记忆
- 编程效率极低
- 不同的硬件架构的机器指令不兼容,可移植性为0
-
2.2.汇编语言
在二进制序列的基础上,增加了一组助记符。用具有人类语言意义的标记符与对应的二进制序列进行关联。
例如:ADD 001001001
(1)存在的问题:
仍与硬件架构强绑定,可移植性差,编写复杂程序时代码量庞大
2.3.B语言
1969 年由肯・汤普森(Ken Thompson)在贝尔实验室开发,基于更早的 BCPL 语言简化而来,是 C 语言的 “前身”。
首次引入高级语言的部分特性(如结构化编程、简单的变量封装),摆脱了汇编语言对硬件的强依赖,为 C 语言的诞生奠定了语法和思想基础。
(1)存在的问题:
-
-
- 无类型系统,所有变量均为机器字长
- 功能有限,仅适用于小型程序开发,难以满足复杂系统(如操作系统)的需求。
-
2.4.C语言
(1)C语言的诞生
诞生:1972-1973 年,丹尼斯・里奇(Dennis Ritchie)在贝尔实验室基于 B 语言改进,首次引入数据类型系统(int、char、float 等)和指针特性,命名为 C 语言。
早期应用:最初用于编写 Unix 操作系统内核,凭借高效性、灵活性和一定的可移植性,迅速在贝尔实验室及业内传播。
(2)C语言的发展
早期困境:
缺乏统一标准,不同厂商(如 IBM、微软)在 C 语言基础上随意修改和扩展(如不同编译器支持的语法差异、库函数不一致),导致 “同一份 C 代码在不同平台无法兼容编译”,严重限制了 C 语言的推广。
C语言的标准化历程
为解决早期混乱问题,国际标准化组织(ISO)和美国国家标准协会(ANSI)先后推动 C 语言的标准化,明确了 C 语言的语法、关键字、库函数等核心规范,确保不同平台、不同编译器下的 C 语言具有一致性。具体的标准制定的历程如下:
3.C语言的“小缺陷”
俗话说,任何事物都具有两面性,在赋予编程者更高的硬件操作权限的同时,也隐藏着风险:
-
- 在手动管理内存的时候,有些马虎的家伙可能在malloc(申请内存)后忘记free(释放内存)从而导致内存泄漏的问题。
- 指针使用过后忘记置空(NULL)
- 语法过于灵活,在编程过程中容易出错
- 缺乏面向对象的特性等等问题。
但是,在某些程度上来说,这些问题都是可以通过规范化的编程习惯来避免的。