本节完成第一个 C 程序,并说明从源码到可执行文件的流程。多数读者可直接使用本站在线编译器编写、编译并运行示例,无需先在本机安装编译器或大型 IDE;若课程要求在本机提交可执行文件,或需要在无网络环境练习,文末也给出各系统安装 GCC / Clang 的入口。

本站在线运行(推荐入门)

打开 C 语言在线编译器:在页面中编辑 .c 源码,点击运行后由服务端完成编译与执行,编译输出与程序运行结果会显示在结果区域。与本教程前几章的语法、标准输入输出练习兼容;后续若涉及多文件工程或特定系统 API,以课程指定的本地工具链为准。

教程中部分示例带有运行按钮,会打开预设代码的测试页,逻辑与上述在线编译器相同。若本机尚未配置环境,建议先以在线编译器跟练下文 Hello World,再按需安装本地编译器体验终端中的 gcc 命令。

本地安装编译器(可选)

编译器负责把 C 源码翻译成机器码并链接成可执行文件;日常以 GCC 和 Clang 最为常见。仅在需要离线练习、或作业要求本地编译时,再按系统查阅专题文章(文中含完整步骤,本节不重复展开):

安装后在终端执行 gcc --version 或 clang --version,能打印版本号即表示可用。

第一个程序:Hello, World!

将下列代码保存为 hello.c(也可在在线编译器中直接粘贴)。建议亲手敲一遍而不是只阅读,便于熟悉符号与报错信息。

C 语言第一个程序 Hello World运行
#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;可先改用在线编译器运行

调试代码可以遵循这样的节奏:先读懂报错,对照资料排查问题,修改完成后再次编译。保持这个习惯,越往后写代码越轻松。