C 语言简介
在动手装环境之前,我们先认识一下 C 语言到底是什么、为什么值得学、能用它做什么。理解了背景,学习的时候会更有的放矢。
C 是什么?
C 语言是 1972 年由 Dennis Ritchie 在美国贝尔实验室(Bell Labs)设计的一门静态编译型语言。它的最初目的非常具体:为重写 UNIX 操作系统提供一门合适的语言。在那之前,操作系统都是用汇编语言写的(直接和 CPU 指令打交道),换一种 CPU 就要全部重写。Ritchie 想要一门"足够底层能写操作系统,又足够高级能跨平台"的语言,C 就此诞生。
诞生背景:革命性的成果
结果是革命性的:用 C 重写的 UNIX 成了至今最具影响力的操作系统——今天的 Linux、macOS、Android 底层全是它的后裔。C 也顺势成了统治世界的基础语言。Ritchie 和 Brian Kernighan 在 1978 年合写的《The C Programming Language》(俗称 K&R),直到今天仍是编程书的典范——薄薄一本,字字珠玑。
有趣的是,C 语言是由 B 语言演化而来的——B 语言的发明者正是 Ken Thompson(Dennis Ritchie 的同事,Unix 之父、Go 语言的三位发明者之一)。可以说 C 是 Unix 家族的"母语"。
第一个 C 程序
说了这么多,先看一眼代码。C 的 Hello World 是编程界的"圣典",几乎所有语言的入门都从它致敬:
#include <stdio.h>
int main(void) {
printf("Hello, World!\n");
return 0;
}
// 输出: Hello, World!运行它只需要三步:
# 1. 把上面代码保存为 hello.c
# 2. 用 gcc 编译
gcc hello.c -o hello
# 3. 运行
./hello
# 输出: Hello, World!几个关键点:#include 把标准库"复制粘贴"进来,你才能用 printf;int main 是程序入口,操作系统调用它;printf 是格式化打印;return 0 告诉操作系统"正常结束"。
C 的核心特点
- 静态类型 + 编译型:编译期检查类型错误,运行性能极高,接近汇编。
- 接近硬件:直接操作内存(指针)、能做位运算、能内嵌汇编。可移植性虽好,但写法上仍贴近机器。
- 没有垃圾回收(GC):程序员手动管理内存,控制权完全交给你——好处是极致性能,代价是容易内存泄漏。
- 语法简洁:只有 32 个关键字(C89)/ 44 个(C99),没有面向对象、没有继承、没有异常。
- 可移植性强:同一份 C 代码,在不同平台重新编译就能跑,这是它能统治系统编程的关键。
- 运行效率高:编译产物是原生机器码,没有虚拟机中间层,速度仅次于手写汇编。
- 影响深远:C++、Java、C#、PHP、JS、Go 的语法都借鉴了 C,学一次受益终身。
C 都用在哪?典型应用场景
C 是"看不见但无处不在"的语言。下面这些明星项目,全是 C 写的:
- 操作系统:Linux 内核、Windows 内核、macOS(Darwin)、FreeBSD。
- 数据库:MySQL、PostgreSQL、SQLite、Redis。
- Web 服务器:Nginx、Apache httpd。
- 语言运行时:CPython(Python 解释器)、PHP 引擎、Ruby(MRI)、Node.js 的 V8 引擎底层。
- 嵌入式与物联网:单片机、Arduino、汽车 ECU、智能家电。
- 网络与协议:TCP/IP 协议栈、OpenSSL、cURL。
- 图形与多媒体:OpenGL、FFmpeg、GIMP。
简单说:需要极致性能、需要直接操作硬件、需要长期稳定运行的基础设施,C 都是首选之一。
C vs 其他语言
- vs C++:C++ 是 C 的超集,加了面向对象、模板、STL。C 更简单纯粹,C++ 更强大但也更复杂。
- vs Java:Java 跑在 JVM 上,跨平台靠虚拟机,有 GC;C 编译成原生码,跨平台靠重新编译,没 GC。
- vs Python:C 性能是 Python 的几十倍,但写起来更繁琐;Python 解释器本身就是 C 写的。
- vs Go:Go 是 C 的"现代孙子"(Go 的发明者之一 Ken Thompson 也是 C 时代的人),有 GC、并发原生支持,但运行性能略低于 C。
- vs Rust:Rust 性能与 C 相当,但通过所有权模型保证内存安全,无 GC;学习曲线比 C 陡。
该不该学 C?
如果你的方向是系统编程、嵌入式、数据库、游戏引擎、操作系统,C 几乎是必修课。即使你写 Java/Python/JS,C 也是值得学的"内功"——它逼着你理解计算机如何工作:内存怎么分配、指针是什么、栈和堆的区别。学完本系列,你将能独立读懂 Linux 内核代码片段、给 Redis 修 bug、给单片机写驱动。
C 标准的演化
语言会随时间演进,C 的标准主要有这几个版本:
- K&R C(1978):最早的非正式标准,由那本书定义。
- C89 / ANSI C(1989):第一个正式 ANSI/ISO 标准,32 个关键字。
- C99(1999):加入
//注释、变长数组、long long、<stdbool.h>。 - C11(2011):加入多线程支持、原子操作、泛型宏。
- C17 / C18(2018):主要是修复,无大改动。
- C23(2023):大量现代特性,如
constexpr、nullptr。
本教程以 C99/C11 为主,这是当前 gcc 默认支持的、用得最广泛的版本。
← 返回 C 语言教程目录
下一篇 C 环境搭建 →