Skip to content

C 快速指南

C 是一种通用、过程式编程语言,以其效率和低级内存访问而闻名。由 Dennis Ritchie 于 1972 年在贝尔实验室(Bell Labs)为 UNIX 操作系统开发。

由 ANSI(C89)和 ISO 标准化,后续版本如 C99、C11、C17 添加了新功能。

广泛应用于系统编程、嵌入式系统、性能关键型应用和基础软件。

  • 高效
  • 低级内存访问(指针)
  • 结构化(函数)
  • 可移植
  • 许多其他语言的基础
  • 为编写 UNIX 而发明。
  • B 语言的后继者。
  • 由 ANSI(1989 年)和 ISO 标准化。
  • Linux、macOS、Windows 内核的核心语言。
  • 用于数据库、编译器、游戏引擎等。

要编写、编译和运行 C 程序,您需要:(a) 一个文本编辑器 和 (b) 一个 C 编译器。

用于编写源代码(以 .c 结尾的文件)。现代编辑器提供语法高亮、自动补全等功能。

常用选择:Visual Studio Code (VS Code)、Sublime Text、Atom、Vim、Emacs、Notepad++ (Windows)。

源文件包含人类可读的代码。请确保您知道如何以 .c 扩展名保存文件。

将您的 .c 源文件翻译成机器码(可执行程序),供计算机的 CPU 运行。

常用编译器:

  • GCC (GNU Compiler Collection): 自由、开源,广泛适用于 Linux、macOS 和 Windows(通过 MinGW-w64/MSYS2 或 WSL)。支持 C 和 C++。
  • Clang: 另一个流行的开源编译器,以编译速度快和诊断信息好而闻名。常与 LLVM 一起使用。
  • MSVC (Microsoft Visual C++): Windows 上 Visual Studio 的一部分。编译 C 和 C++。

安装方式因操作系统而异:

使用您发行版的包管理器。检查是否安装了 GCC:

$ gcc --version

如果未安装,使用以下命令:

# Debian/Ubuntu
sudo apt update
sudo apt install build-essential
# Fedora/CentOS/RHEL
sudo dnf groupinstall "Development Tools"
# Arch Linux
sudo pacman -S base-devel

从 App Store 安装 Xcode,或只安装 Command Line Tools。打开终端(Terminal)并运行:

$ xcode-select --install

这将提供 GCC(通常是 Clang 的别名)和其他开发工具。

  • 推荐:WSL (Windows Subsystem for Linux): 从 Microsoft Store 安装 Linux 发行版(如 Ubuntu)。然后在 WSL 内遵循上面的 Linux 安装步骤。
  • MSYS2/MinGW-w64: 提供最新的适用于 Windows 的原生 GCC 工具链。从 https://www.msys2.org/ 下载,遵循其说明安装 mingw-w64-x86_64-toolchain 软件包。确保将 MinGW 的 bin 目录(例如,C:\msys64\mingw64\bin)添加到系统的 PATH 环境变量中。
  • Visual Studio Community: 从 https://visualstudio.microsoft.com/vs/community/ 下载。安装期间,选择“使用 C++ 的桌面开发”工作负载,其中包含 C 编译器(cl.exe)和构建工具。

让我们看一个最小的 C 程序。

一个基本的 C 程序结构包括:

  • 预处理指令 (Preprocessor Directives) (例如,#include)
  • 函数 (Functions) (至少有 main)
  • 变量 (Variables) (可选)
  • 语句 (Statements) 和 表达式 (Expressions)
  • 注释 (Comments)

示例 hello.c:

// 包含标准输入/输出库,用于 printf
#include <stdio.h>
// main 函数:程序执行从这里开始
int main(void) {
/* 多行注释:
这个程序打印 Hello, World! */
printf("Hello, World!\n"); // 调用 printf 函数的语句
return 0; // 表示成功执行
}

说明:

  • #include <stdio.h>:一个预处理指令,告诉编译器包含标准输入/输出头文件 <stdio.h> 的内容,该文件包含了 printf 的声明。
  • int main(void):主函数,程序执行从这里开始。int 表示它返回一个整型状态码;void 表示它不接受参数(或者也可以是 int main(int argc, char *argv[]) 用于命令行参数)。
  • // … 和 /* … */:注释,被编译器忽略,用于解释说明。
  • printf(…):一个标准库函数,用于向控制台输出文本。\n 是一个转义序列,表示换行符。
  • return 0;:退出 main 函数并向操作系统返回 0,通常约定表示成功执行。

步骤:

  1. 将上面的代码保存在名为 hello.c 的文件中。
  2. 打开一个终端(terminal)或命令提示符(command prompt)。
  3. 导航到保存文件的目录。
  4. 使用 C 编译器编译代码(例如,GCC):gcc hello.c -o hello(或 clang hello.c -o hello)。-o hello 部分指定输出的可执行文件名称。
  5. 如果没有错误,将创建一个名为 hello(在 Windows 上为 hello.exe)的可执行文件。
  6. 运行程序:./hello(在 Linux/macOS/WSL 上)或 hello.exe(在 Windows 命令提示符上)。

预期输出:

$ gcc hello.c -o hello
$ ./hello
Hello, World!

确保编译器(gcc、clang 等)已添加到您的系统 PATH 环境变量中。

理解 C 语法的基本构成要素。

一个 C 程序由记号组成。记号是程序中最小的独立单元,例如关键字(keywords)、标识符(identifiers)、常量(constants)、字符串字面量(string literals)和符号(symbols)。例如,语句:

printf("Hello, World!\n");

构成以下记号:

printf
(
"Hello, World!\n"
)
;

在 C 中,分号用作语句终止符。每个独立的语句必须以分号结尾。

两个语句的示例:

printf("Hello!\n");
return 0;

注释是解释性文本,会被编译器忽略。C 支持两种类型:

/* 这是一个多行注释。
它可以跨越多行。 */
// 这是一个单行注释 (C99 中引入)。它在换行符处结束。

注释不能嵌套(在一个 /* … / 块内部再使用 / 通常有问题)。

标识符是用于变量、函数、标签和其他用户自定义项的名称。规则:

  • 必须以字母 (a-z, A-Z) 或下划线 (_) 开头。
  • 后续字符可以是字母、下划线或数字 (0-9)。
  • 不能包含标点符号,如 @、$、%。
  • 区分大小写:myVar 和 myvar 是不同的标识符。
  • 不能与 C 关键字相同。

有效标识符示例:

count _temp value1 calculate_sum MAX_ENTRIES

关键字是 C 中具有特殊含义的保留字。它们不能用作标识符。

标准关键字 (C11 及更早版本)
autodoubleintstruct
breakelselongswitch
caseenumregistertypedef
charexternreturnunion
constfloatshortunsigned
continueforsignedvoid
defaultgotosizeofvolatile
doifstaticwhile
_Bool_Complex_Imaginaryinline (C99)
restrict (C99)

注意:以下划线开头的关键字通常是保留的或属于后续标准的一部分。

空白字符指空格、制表符、换行符和注释。C 编译器在很大程度上忽略空白字符,但它对于分隔记号至关重要。

例如,在 int age; 中,int 和 age 之间的空白字符是必需的。然而,在 result = value1 + value2; 中,等号 = 和加号 + 周围的空白字符是可选的,但可以提高可读性。

int age; // 需要空白字符
fruit=apples+oranges; // 可以工作,但可读性较差
fruit = apples + oranges; // 可读性更好

空行也会被忽略,可以用于组织代码。