第2章:第一个C程序——Hello World,理解main函数、printf、编译与运行过程
说实话,学任何一门编程语言,第一个程序几乎都是“Hello World”。这就像学说话先会喊“妈妈”一样自然。我当年第一次在屏幕上看到那行字时,心里还挺激动的——虽然现在看来,那不过是几行代码的简单组合。
这一章,我们就来亲手写出第一个C程序。别小看它,里面藏着C语言的几个核心概念:main函数、printf输出、以及编译与运行的完整流程。搞懂了这些,后面40天你会走得很顺。
2.1 先看代码长什么样
打开你的编辑器(我用的是VS Code,也有人喜欢CLion或记事本),敲下这段代码:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
保存为 hello.c。注意,扩展名必须是 .c,不是 .txt 也不是 .doc。我见过有人把代码写在Word里然后问我为什么编译不过……嗯,那是真事。
2.2 逐行拆解:每一行都在干什么
第一行:#include <stdio.h>
这行叫“预处理指令”。说白了,就是告诉编译器:“我要用标准输入输出库里的东西。” stdio.h 是C语言自带的头文件,里面声明了 printf、scanf 这些函数的原型。
你想想看,如果没有这行,你写 printf 编译器根本不认识它。就像你打电话之前得先存了对方的号码一样。
#include 放在文件最顶部,顺序一般是:标准库 → 第三方库 → 自己写的头文件。这样找起来方便。
第二行:int main()
这是程序的入口函数。C程序从 main 开始执行,也在这里结束。每个C程序有且只有一个 main 函数。
int 表示这个函数执行完后会返回一个整数值给操作系统。返回 0 通常表示“程序正常结束”,返回非零值表示“出错了”。
void main(),这在某些编译器里能通过,但不符合C标准。我建议你从一开始就写 int main(),养成好习惯。
第三行:printf("Hello, World!\n");
printf 是输出函数,把括号里的内容打印到屏幕上。这里的 \n 是换行符,告诉光标移到下一行。
我曾经在调试一个串口通信程序时,发现输出总是不换行,查了半天才发现是忘了加 \n。这种小细节,往往最坑人。
第四行:return 0;
返回0给操作系统,表示程序正常退出。这行可以省略吗?在C99标准里,如果 main 函数末尾没有 return 0;,编译器会自动补一个。但我建议你显式写出来,代码更清晰。
2.3 编译与运行:从代码到可执行文件
代码写好了,怎么让它跑起来?这中间有个“翻译”过程,叫编译。
我用的是 gcc 编译器(GNU C Compiler)。在终端里输入:
gcc hello.c -o hello
这条命令的意思是:用gcc编译 hello.c,生成一个名为 hello 的可执行文件。然后运行它:
./hello
屏幕上就会显示:
Hello, World!
整个过程分四步,我画了张图帮你理解:
简单总结一下:
- 预处理:处理
#include、#define等指令,生成.i文件 - 编译:把C代码翻译成汇编代码,生成
.s文件 - 汇编:把汇编代码转成机器码,生成
.o或.obj文件 - 链接:把多个目标文件和库文件合并,生成最终的可执行文件
你平时用 gcc hello.c -o hello 一条命令就搞定了,其实背后编译器帮你干了这四件事。
2.4 常见错误与避坑指南
写第一个程序时,最容易犯这些错。我当年几乎全踩过:
| 错误写法 | 问题说明 | 正确写法 |
|---|---|---|
printf("Hello, World!\n") 漏了分号 |
C语言每条语句以分号结尾 | printf("Hello, World!\n"); |
#include <stdio.h> 写成 #include <stdio> |
头文件名写错 | #include <stdio.h> |
int main() 写成 int mian() |
函数名拼写错误 | int main() |
| 花括号不匹配 | 少写或多写一个 { 或 } |
检查花括号成对出现 |
我曾经在写一个嵌入式项目时,因为 printf 里忘了加 \n,导致串口输出全部挤在一行,调试了整整一个下午。后来我养成了一个习惯:每个 printf 写完立刻检查末尾有没有 \n。
2.5 动手试试:修改你的第一个程序
光看不练可不行。我建议你马上做这几件事:
- 把
"Hello, World!"改成你的名字,重新编译运行 - 试试去掉
\n,看看输出有什么变化 - 故意漏掉一个分号,看看编译器报什么错
- 把
return 0;改成return 1;,运行后执行echo $?(Linux/Mac)或echo %ERRORLEVEL%(Windows),看看返回值
这些实验会让你对编译过程和错误信息有更直观的感受。别怕报错,编译器报的错其实是帮你找问题的好朋友。
2.6 本章小结
这一章我们做了三件事:
- 写了一个完整的C程序,理解了
main函数和printf的作用 - 走了一遍编译到运行的完整流程
- 见识了几个常见错误,知道怎么避免
说实话,Hello World 虽然简单,但它是一个完整的闭环——从编写到运行,每一步都走通了。后面40天里,我们会在这个基础上不断加东西,但核心框架始终不变。
嗯,下一章我们会聊变量和数据类型。不过在那之前,先把今天的内容练熟。代码这东西,敲一遍比看十遍管用。