程序结构与基本语法(Program Structure & Basic Syntax)
介绍 C 语言程序的基本骨架——一个完整的 C 程序由哪些部分构成,以及编译器如何理解这些部分。
1. 第一个 C 程序
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
}
逐行解析:
| 代码 | 含义 |
|---|---|
#include <stdio.h> |
引入标准输入输出头文件,使 printf 可用 |
int main() |
程序的入口函数,操作系统从这里开始执行 |
{ ... } |
函数体的起止边界 |
printf("Hello, World!\n"); |
调用库函数输出文本,\n 表示换行 |
return 0; |
向操作系统返回 0,表示程序正常结束 |
2. C 程序的基本骨架
┌─────────────────────────────┐
│ #include 预处理指令 │ ← 引入头文件
├─────────────────────────────┤
│ 全局变量 / 宏定义(可选) │ ← 整个文件可见的数据
├─────────────────────────────┤
│ int main() │ ← 唯一的入口点
│ { │
│ 语句; │ ← 逐条执行
│ return 0; │
│ } │
├─────────────────────────────┤
│ 其他函数定义(可选) │ ← 供 main 或其他函数调用
└─────────────────────────────┘
关键规则
- 有且仅有一个
main函数:程序执行的起点。 - 语句以分号
;结尾:C 语言用分号标识一条语句的结束,遗漏分号会导致编译错误。 - 大小写敏感:
Main、MAIN、main是三个不同的标识符。 - 空白字符(空格、换行、制表符)不影响语义:编译器会忽略多余空白,但合理缩进对可读性至关重要。
3. 注释(Comment)
注释是写给开发者看的文字,编译器会完全忽略。
// 这是单行注释(C99 起支持)
/*
* 这是多行注释
* 可以跨越多行
* 不可嵌套(/* 里面再写 */ 会出错)
*/
int x = 10; // 行尾注释,解释这行代码的意图
使用原则
| 做法 | 推荐程度 | 原因 |
|---|---|---|
| 解释"为什么这么做" | 推荐 | 意图是代码本身无法传达的 |
| 解释"做了什么" | 酌情 | 复杂逻辑值得说明,简单赋值则不必 |
重复代码内容(如 x = 10; // 把 10 赋给 x) |
不推荐 | 属于冗余信息 |
4. 预处理指令(Preprocessor Directive)
以 # 开头的行在编译前由预处理器处理。
#include <stdio.h> // 引入系统头文件
#include "myfile.h" // 引入项目自定义头文件
#define PI 3.14159 // 宏定义:编译前将 PI 全部替换为 3.14159
| 写法 | 查找路径 |
|---|---|
#include <file.h> |
先在系统目录中查找 |
#include "file.h" |
先在当前目录查找,再查系统目录 |
5. 编译与运行的流程
源文件 (.c) → 预处理 → 编译 → 汇编 → 链接 → 可执行文件
hello.c hello.i hello.s hello.o a.out / hello.exe
常用的编译命令(以 GCC 为例):
gcc hello.c -o hello # 编译并链接,生成可执行文件 hello
gcc -c hello.c -o hello.o # 仅编译,生成目标文件(不链接)
gcc hello.o -o hello # 链接目标文件,生成可执行文件
6. 常见错误速查
| 错误 | 原因 | 解决方法 |
|---|---|---|
undefined reference to 'printf' |
未链接标准库或遗漏 #include <stdio.h> |
确认头文件已包含 |
expected ';' before '}' |
某条语句末尾缺少分号 | 检查上一行是否以 ; 结尾 |
'main' must return 'int' |
main 的返回类型不是 int |
将 void main() 改为 int main() |
implicit declaration of function |
使用函数前未声明或未包含对应头文件 | 添加 #include 或前置声明 |
7. 总结
| 要点 | 说明 |
|---|---|
main 函数 |
程序的唯一入口,返回 int |
| 分号 | 每条语句必须以 ; 结尾 |
#include |
引入头文件,使外部函数可用 |
| 注释 | 解释意图,不解释显而易见的代码 |
| 编译 | 源码 → 预处理 → 编译 → 汇编 → 链接 → 可执行文件 |
作者: Qing | 修改日期: 2026-07-18