跳到主要内容
🔍
0.2.4已发布beginner · 约 1 课时 · P0

第一个程序:Hello World 全流程

理解源文件到可执行文件的完整链路,在双平台跑通第一个 C 程序

  • 来源

标记说明:【来源】来自上传资料 · 【补充】课程新编 · 【纠错】按勘误表修正 · 【更新】过时内容已现代化 · 【待确认】无法可靠还原

完成标准(本章)

  • 📖 已阅读:滚动 ≥ 80% 且有效阅读 ≥ 90
  • ✏️ 已练习:小练习正确率 ≥ 60%
  • 📝 已通过测验:分数 ≥ 60
  • 🛠️ 已掌握还需完成实践任务
学习状态:未开始

0.2.4 第一个程序:Hello World 全流程

本章来源:程序结构与编译流程来自《第一阶段讲义》12.2/12.3 节【来源】;示例代码重新编写并双平台实测【补充】(原资料代码为截图无法还原)。 平台适用性:universal(编译命令双平台通用;.exe 后缀与运行方式为【平台差异】)。

① 学习目标

  1. 说出一个 C 程序的最小结构(头文件、main、语句、返回值);
  2. 用一条 gcc 命令完成编译并运行程序;
  3. 解释 -o 参数与返回值的含义,并会用 $?(Windows %errorlevel%)查看退出码;
  4. 说出"编译"与"运行"是两件不同的事;
  5. 在 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;Windows hello.exe
  • 退出码:Linux ./retdemo; echo $?;Windows retdemo.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 即可运行。(判断)

    ◌ 未作答

⑨ 章节测验

章节测验

5 题题库 · 随机抽 5 题 · 及格线 60 分 · 前端判分(学习自测)
开始测验 →

⑩ 实战任务

实践任务

双平台跑通 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 命令同构)
练习/测验/任务补充全部新编