本节完成第一个 C 程序,并说明从源码到可执行文件的流程。多数读者可直接使用本站在线编译器编写、编译并运行示例,无需先在本机安装编译器或大型 IDE;若课程要求在本机提交可执行文件,或需要在无网络环境练习,文末也给出各系统安装 GCC / Clang 的入口。
本站在线运行(推荐入门)
打开 C 语言在线编译器:在页面中编辑 .c 源码,点击运行后由服务端完成编译与执行,编译输出与程序运行结果会显示在结果区域。与本教程前几章的语法、标准输入输出练习兼容;后续若涉及多文件工程或特定系统 API,以课程指定的本地工具链为准。
教程中部分示例带有运行按钮,会打开预设代码的测试页,逻辑与上述在线编译器相同。若本机尚未配置环境,建议先以在线编译器跟练下文 Hello World,再按需安装本地编译器体验终端中的 gcc 命令。
本地安装编译器(可选)
编译器负责把 C 源码翻译成机器码并链接成可执行文件;日常以 GCC 和 Clang 最为常见。仅在需要离线练习、或作业要求本地编译时,再按系统查阅专题文章(文中含完整步骤,本节不重复展开):
- Windows:Windows 安装 C 编译器(常见为 VS Code + MinGW-w64、MSYS2 或 WSL 中的 GCC)。
- macOS:macOS 安装 C 编译器(Command Line Tools 中的 Clang)。
- Linux:Linux 安装 C 编译器(发行版包管理器安装
gcc/build-essential)。
安装后在终端执行 gcc --version 或 clang --version,能打印版本号即表示可用。
第一个程序:Hello, World!
将下列代码保存为 hello.c(也可在在线编译器中直接粘贴)。建议亲手敲一遍而不是只阅读,便于熟悉符号与报错信息。
#include <stdio.h>
int main(void) {
printf("Hello, World!\n");
return 0;
}若已安装本地编译器,可在终端里编译并运行:
# Linux / macOS
gcc -Wall hello.c -o hello && ./hello
# Windows (MinGW)
gcc -Wall hello.c -o hello.exe && hello.exe屏幕输出:
Hello, World!这里的 -Wall 让编译器打开所有常见警告,能帮初学者省去很多查错的时间。
逐行拆解
每个部分拆开看:
#include <stdio.h>:C 程序靠库提供功能。最常用的输出函数 printf 定义在 stdio.h 这个头文件里,这行就是把它引入你的程序。int main(void):程序被操作系统启动后,执行的第一段代码总是 main 函数。前面的 int 表示要返回一个整数;void 表示它不需要命令行参数。{ ... }:main 的函数体,花括号里是按顺序执行的语句。printf("Hello, World!\n");:调用输出函数。\n 是转义序列,表示换行。C 语言里每条完整语句必须以分号 ; 结尾,编译器靠分号识别语句边界。return 0;:把 0 返回给操作系统,表示程序正常结束。非 0 值通常表示出错,脚本、CI 系统会读这个退出码判断成败。
改一改再跑:把字符串换成你的名字;故意删掉分号,看编译器报什么错;删掉 #include,看它怎么提示 printf 未声明。
编译到底发生了什么
C 不像 Python 那样逐行解释执行,而是先把整个源码翻译成机器指令,生成可执行文件,再由操作系统运行。这个过程拆成四步:
hello.c(源码)
↓ ① 预处理(preprocessing):展开 #include、处理 #define 宏
↓ ② 编译(compiling):把 C 源码翻译成汇编
↓ ③ 汇编(assembling):把汇编翻译成机器码,生成目标文件 hello.o
↓ ④ 链接(linking):把 printf 等库函数接进来,生成可执行文件 hello
hello(可执行文件)这一步暂时不用记细节,对整体流程有个概念就行了。后面学到宏(#define)和多文件工程时,会再回来深入理解这四步。
常见错误快速排查
| 报错特征 | 常见原因 |
|---|---|
expected ';' before ... | 漏了分号,上一行结尾补 ; |
implicit declaration of function 'printf' | 忘了 #include <stdio.h> |
undefined reference to 'main' | 没有 main 函数,或拼写/大小写不对 |
gcc: command not found | 编译器没装或没加入 PATH;可先改用在线编译器运行 |
调试代码可以遵循这样的节奏:先读懂报错,对照资料排查问题,修改完成后再次编译。保持这个习惯,越往后写代码越轻松。