1972 年,贝尔实验室的 Dennis Ritchie 需要一门既能写操作系统、又比汇编好移植的语言。当时他和 Ken Thompson 正在用汇编开发 Unix,这个过程很痛苦。C 语言就是为这个目标写的,最初只是重写 Unix 的工具,五十年后,它成了几乎所有现代软件栈的基础。Java、PHP、JavaScript 的语法和特性都直接或间接地从 C 语言借鉴过,所以它常被称为编程语言的源头。

它今天的地位不难看出来:Linux、Windows、macOS 的内核和大量系统组件是 C 语言写的;PHP、Python 的核心解释器本身也是 C 语言;Nginx、Redis、MySQL 这类对性能敏感的服务,主干同样是 C 语言;嵌入式设备、游戏引擎、网络协议栈、实时系统里,C 语言依然是首选。

C 语言是一门什么样的语言

C 语言的几个关键属性,决定了它快在哪、难在哪、为什么重要:

  • 编译型:源码先用编译器(GCC、Clang 等)翻译成可执行文件,再交给操作系统运行。中间没有 Python、JavaScript 那种解释器或虚拟机环节,跑起来接近机器速度;代价是改一行代码就得重新编译一次。
  • 通用中级语言:它不像高级语言那样离硬件远,也不像汇编那样贴着 CPU。既能直接操作内存(指针),又有函数、循环这些抽象,适合在低资源环境里工作。
  • 静态类型:每个变量的类型在编译时就定死了。写错类型,编译器在运行前就会拦下,不会像 Python 那样跑到一半才崩。
  • 过程式:程序由一个个函数组成,数据和操作分开组织,没有类、对象那套。
  • 不被托管:内存要自己分配(malloc)和释放(free),运行时没有垃圾回收兜底。这是 C 语言最大的威力,也是无数 bug 的根源。
编译型:C 解释型:Python 源码 hello.c 编译器 gcc 一次翻译全部源码 可执行文件 hello 交给操作系统运行 源码 hello.py 解释器 逐行读、逐行执行 直接得到输出结果 没有独立可执行文件
编译型:一次翻译整个源码再运行;解释型:逐行读、逐行执行,不生成独立的可执行文件。

编译型是先翻译成可执行文件再运行,解释型是边读边执行,没有单独的可执行文件。

学 C 语言比其他语言更接近编程本质:指针怎么访问内存、函数调用时栈上发生了什么、数据在字节层面怎么存。有了这层底子,再看其他现代语言会容易很多。

为什么今天还要学 C

学 C 语言有几个现实的好处:

  • 理解本质:学完 C 再看任何语言,都能明白变量在内存里到底是什么,引用的背后又是什么。
  • 就业硬需求:嵌入式、操作系统、驱动、编译器、数据库、游戏引擎、实时系统这些方向,C 语言仍是主力。
  • 为其他语言打底:C++ 在语法上几乎就是 C 语言加上了类,Go 的很多底层思想也来自 C 语言。
  • 效率上限:资源受限或性能敏感的场景(物联网、内核、高频交易),C 语言的位置短期很难被替代。

学 C 语言的预期

C 语言常被说成难学,它本身并不复杂,难的是内存的管理责任全在你自己。这本教程就按这个思路排:先把语法和类型过一遍,再把指针和内存作为主线反复强化。

接下来动手搭环境,写出第一个 C 程序。