第一个程序:Hello World 全流程
理解源文件到可执行文件的完整链路,在双平台跑通第一个 C 程序
- 来源
标记说明:【来源】来自上传资料 · 【补充】课程新编 · 【纠错】按勘误表修正 · 【更新】过时内容已现代化 · 【待确认】无法可靠还原
完成标准(本章)
- 📖 已阅读:滚动 ≥ 80% 且有效阅读 ≥ 90 秒
- ✏️ 已练习:小练习正确率 ≥ 60%
- 📝 已通过测验:分数 ≥ 60 分
- 🛠️ 已掌握还需完成实践任务
0.2.4 第一个程序:Hello World 全流程
本章来源:程序结构与编译流程来自《第一阶段讲义》12.2/12.3 节【来源】;示例代码重新编写并双平台实测【补充】(原资料代码为截图无法还原)。 平台适用性:universal(编译命令双平台通用;.exe 后缀与运行方式为【平台差异】)。
① 学习目标
- 说出一个 C 程序的最小结构(头文件、main、语句、返回值);
- 用一条 gcc 命令完成编译并运行程序;
- 解释
-o参数与返回值的含义,并会用$?(Windows%errorlevel%)查看退出码; - 说出"编译"与"运行"是两件不同的事;
- 在 Windows 与 Linux 双平台跑通 Hello World(实践任务)。
② 前置知识
- 必修:0.2.1 Windows 环境(本章第一个编译在本地完成);
- 建议:0.2.2/0.2.3(Linux 环境与远程开发,实践任务需要)。
③ 核心概念【来源】
| 概念 | 说明 |
|---|---|
| 最小程序结构 | 头文件 #include <stdio.h> → int main(void) → 语句(分号结尾)→ return 0 |
| 编译命令 | gcc 源文件 -o 输出名;不带 -o 默认 a.out(Windows a.exe) |
| 编译 vs 运行 | 编译=翻译成可执行文件;运行=操作系统加载执行——两个独立步骤 |
| 返回值 | main 返回 0 成功、非 0 失败;shell 用 $? 获取 |
| 运行方式 | Linux:./hello(当前目录不在 PATH);Windows:hello.exe |
④ 通俗解释【补充】
把"写程序"比作"写信寄信":
- 写 .c 文件 = 用人类的语言(C 语法)写信;
- 编译(gcc) = 把信翻译成机器能读的电报码,装进信封(可执行文件);
- 运行(./hello) = 把信封投进邮筒,机器收到后执行——"翻译"和"投递"是两件事,很多人卡在"编译过了为什么没输出",往往是忘了运行;
- 返回值 = 回执单:0 表示"顺利送达",42 之类的数字表示"出了点状况"——shell 的
$?就是查询回执的方式。
⑤ 示例代码【补充,代码新写并双平台实测】
代码示例与验证记录
- examples/ex1-hello.c第一个 C 程序(结构与注释)✓ 已实测(gcc 15.2.0 / MinGW-w64 x86_64, 2026-08-15)编译:
gcc ex1-hello.c -o hello -std=c11 -Wall -Wextra -Wpedantic适用环境:LinuxWindows(MinGW)展开预期输出(实测)
Hello, World!
差异说明:双平台输出一致;Linux 运行需 ./ 前缀(当前目录不在 PATH)
完整源码见 /code 代码示例页
- examples/ex2-return-value.c程序返回值与 $?✓ 已实测(gcc 15.2.0 / MinGW-w64 x86_64, 2026-08-15)编译:
gcc ex2-return-value.c -o retdemo -std=c11 -Wall -Wextra -Wpedantic适用环境:LinuxWindows(MinGW)展开预期输出(实测)
我返回 42 42
差异说明:第二行 42 来自 shell 的 $?(Windows 用 %errorlevel%);这是"程序与 shell 交互"的第一次接触
完整源码见 /code 代码示例页
⑥ 编译与运行方法
编译命令与实测输出见上方示例卡。要点:
- 编译:
gcc ex1-hello.c -o hello -std=c11 -Wall -Wextra -Wpedantic(-std=c11 固定 C11 标准、-Wall -Wextra 警告全开,从第一个程序就养成习惯); - 运行:Linux
./hello;Windowshello.exe; - 退出码:Linux
./retdemo; echo $?;Windowsretdemo.exe & echo %errorlevel%。
⑦ 常见错误
| 症状 | 原因 | 解决 |
|---|---|---|
| Linux 输入 hello 提示 command not found | 当前目录不在 PATH | 用 ./hello |
| 编译报"未声明 printf" | 缺少 #include <stdio.h> | 补上头文件 |
| 编译通过但没输出 | 忘了运行,或输出在别的窗口 | 明确执行 ./hello |
| 中文注释乱码 | 源码编码与终端不一致 | 源码统一 UTF-8(1.2.6 深入) |
| 分号漏写报错 | C 语句以分号结尾 | 按报错行号定位补分号 |
⑧ 小练习
小练习
学习自测:提交后才显示答案与解析(前端判分,不作为正式考试)ex-0-2-4-1.C 程序的入口函数是?(单选)
◌ 未作答ex-0-2-4-2.main 返回 0 通常表示?(单选)
◌ 未作答ex-0-2-4-3.判断:在 Linux 上运行当前目录的 hello 程序,直接输入 hello 即可运行。(判断)
◌ 未作答
⑨ 章节测验
章节测验
⑩ 实战任务
实践任务
双平台跑通 Hello World 并记录全流程
在 Windows(MinGW)与 Linux(虚拟机/远程)两个环境分别完成"写代码→编译→运行→查看退出码" 的完整闭环,输出一份"Hello World 全流程记录"。
输入与输出
无输入。交付物:两个平台的编译命令、运行命令、实际输出与退出码截图/记录。
功能要求
- Windows:gcc 编译 ex1 与 ex2 并运行,记录输出与 %errorlevel%
- Linux:同两份代码编译运行,记录输出与 $?
- 对比两个平台的可执行文件名与运行方式的差异
限制条件
- 代码使用本章 ex1/ex2(自己重敲一遍,不要复制粘贴后直接提交)
- 必须 -Wall -Wextra 编译且零警告
验收步骤(自检清单 0/4)
验收标准
- 双平台编译零警告(验收步骤 1/2)
- 输出与预期一致且退出码记录正确(验收步骤 3)
- 差异小结至少 3 条(验收步骤 4)
常见失败原因
- Linux 上直接输 hello 报 command not found(需 ./hello)
- 忘加 -Wall -Wextra,把警告当成功
- 在 Windows 用 $? 查看退出码(应用 %errorlevel%)
可选扩展
- 把两份代码与记录提交到 0.3 建好的 Git 仓库
- 用 gcc -E hello.c 看看预处理后的文件有多大(1.1.1 预告)
完成必要清单后才能计入"已完成实践"(学习状态自动推导,不提供一键完成)
⑪ 面试问题
面试问题
从写下 hello.c 到屏幕输出 Hello World,中间发生了什么?高频C/C++ · medium
要点:预处理→编译→汇编→链接得到可执行文件,运行时加载进内存执行,printf 经标准库与系统调用输出。
四阶段:预处理(展开头文件/宏)→ 编译(C 翻译成汇编)→ 汇编(汇编成目标文件 .o)→ 链接(目标文件与标准库合并成可执行文件)。运行时:shell 创建进程、加载器把程序映射进内存、 从 main 开始执行,printf 最终经标准库缓冲与 write 系统调用把字符送到终端。 嵌入式延伸:交叉编译产物需拷贝到目标板运行(阶段 7)。
追问:- 追问:printf 一定直接调用 write 吗?(有用户态缓冲)
评分要点:- 四阶段齐全
- 运行加载概念
main 函数的返回值有什么作用?C/C++ · easy
要点:向调用者(通常是 shell)报告退出状态:0 成功、非 0 失败,脚本据此做判断。
shell 通过 $? 获取退出码;脚本与 CI 大量依赖它(make/测试脚本按退出码决定成败)。 规范:0=成功,非 0=失败(可用不同码区分错误类型)。补充:return 0 在 main 中可省略 (C99 起隐式返回 0),但显式写更清晰。
追问:- 追问:exit(0) 与 return 0 在 main 里等价吗?(等价;exit 可出现在任意函数)
评分要点:- 0/非 0 语义
- 脚本依赖场景
Windows 上编译的 exe 为什么不能直接在 Linux 运行?高频C/C++ · easy
要点:可执行文件格式与系统调用接口不同(PE vs ELF、Win32 API vs POSIX),且依赖各自的动态库。
Windows 可执行文件是 PE 格式,调用 Win32 API,链接 msvcrt/ucrt 等;Linux 是 ELF 格式, 走 POSIX 系统调用与 glibc。同一份 .c 源码需要分别在目标平台编译(或用交叉编译器生成 目标平台二进制)。这也解释了为什么学习环境强调"在哪个平台运行就在哪个平台编译"。
追问:- 追问:什么是交叉编译?(阶段 7 详细展开)
评分要点:- 格式差异
- 接口/库差异
- 重新编译/交叉编译
⑫ 延伸阅读
- 《C 程序设计语言(K&R)》第 1 章:入门(Hello World 的原典);
- man 手册:
man gcc(编译选项总览,按需查阅); - C 标准(C11):5.1.2 程序执行(main 与返回值规定);
- 下一章预告:0.3.1 Git 核心概念与安装——把代码管起来。
迁移训练(migration training)
把本章流程迁移到 Linux / Mac / 开发板: 不变的:源代码、gcc 命令、-Wall -Wextra 习惯、返回值语义; 要改的:可执行文件名(.exe)、运行方式(./hello vs hello.exe)、退出码查询命令($? vs %errorlevel%)、开发板需交叉编译(阶段 7)。
内容来源映射
| 内容部分 | 资料 | 位置 | 标记 | 说明 |
|---|---|---|---|---|
| C 程序结构、编译链接运行流程 | 第一阶段讲义 | 12.2/12.3 节(PAGE 181-183) | 【来源】 | 正文重新组织表述 |
| 示例代码(ex1/ex2) | 无 | 【补充】 | 原资料代码为截图无法还原;本代码重新编写并双平台实测(MinGW 实测,Linux 命令同构) | |
| 练习/测验/任务 | 无 | 【补充】 | 全部新编 |