第4章:函数与程序结构
1. 函数基础
(1) 函数定义
- 函数由 返回类型、函数名、参数列表、函数体 组成:
返回值类型 函数名(参数列表) {
// 函数体
return 返回值;
}
- 示例:
int max(int a, int b) {
return (a > b) ? a : b;
}
(2) 函数调用
- 函数通过 函数名 + 参数列表 调用:
int result = max(5, 10); // result = 10
(3) 函数声明(原型)
- 如果函数定义在调用之后,需要先声明:
int max(int a, int b); // 函数声明(原型)
int main() {
int x = max(5, 10);
return 0;
}
int max(int a, int b) { // 函数定义
return (a > b) ? a : b;
}
2. 变量的作用域与存储类别
(1) 局部变量(自动变量)
- 定义在函数内部的变量,默认是
auto
(可省略),仅在函数内有效:
void func() {
int x = 10; // 局部变量,函数结束后销毁
}
(2) 全局变量(外部变量)
- 定义在函数外部的变量,整个程序可见:
int global_var = 100; // 全局变量
void func() {
printf("%d\n", global_var); // 可以访问
}
(3) static
变量
- 静态局部变量(函数内):
- 生命周期延长到整个程序运行期间,但作用域仍限于函数内:
void counter() {
static int count = 0; // 只初始化一次
count++;
printf("%d\n", count);
}
-
每次调用
counter()
,count
会递增(不会重新初始化为 0)。 -
静态全局变量(文件作用域):
-
限制全局变量仅在当前文件内可见(避免命名冲突):
static int file_scope_var = 42; // 仅当前文件可用
(4) extern
变量
- 用于声明在其他文件中定义的全局变量:
// file1.c
int global_var = 100;
// file2.c
extern int global_var; // 声明,表示变量在别处定义
3. 递归
- 函数可以调用自身,适用于分治问题(如阶乘、斐波那契数列):
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1); // 递归调用
}
- 递归 vs 迭代:
- 递归代码简洁,但可能栈溢出(
Stack Overflow
)。 - 迭代(循环)通常效率更高。
4. 头文件与多文件编译
(1) 头文件(.h
)
- 存放函数声明、宏定义、类型定义等:
// mylib.h
#ifndef MYLIB_H // 防止重复包含
#define MYLIB_H
int max(int a, int b); // 函数声明
#endif
(2) 多文件编译
file1.c
:
#include "mylib.h"
int main() {
printf("%d\n", max(5, 10));
return 0;
}
file2.c
:
#include "mylib.h"
int max(int a, int b) {
return (a > b) ? a : b;
}
- 编译方式:
gcc file1.c file2.c -o program
5. 预处理器(Preprocessor)
(1) #include
- 包含头文件:
#include <stdio.h> // 系统头文件
#include "mylib.h" // 用户头文件
(2) #define
宏定义
- 简单宏:
#define PI 3.14159
- 带参数宏:
#define SQUARE(x) ((x) * (x))
- 注意:宏只是文本替换,可能引发副作用:
int x = 2;
int y = SQUARE(x++); // 展开为 ((x++) * (x++)),x 被递增两次!
(3) 条件编译
#ifdef
、#ifndef
、#else
、#endif
:
#ifdef DEBUG
printf("Debug mode\n");
#else
printf("Release mode\n");
#endif
6. 程序结构建议
- 模块化设计:将功能拆分为多个函数和文件。
- 避免全局变量:尽量使用局部变量,减少副作用。
- 合理使用
static
:限制变量/函数的作用域。 - 头文件保护:用
#ifndef
防止重复包含。 - 递归谨慎使用:确保有终止条件,避免栈溢出。
总结
主题 | 关键点 |
---|---|
函数定义与调用 | 函数由 返回值类型 、函数名 、参数列表 、函数体 组成 |
变量作用域 | 局部变量 (函数内)、全局变量 (程序全局)、static (持久化)、extern (跨文件) |
递归 | 函数调用自身,需有终止条件 |
头文件与多文件编译 | .h 存放声明,#include 引入,gcc file1.c file2.c 编译 |
预处理器 | #define (宏)、#include (头文件)、#ifdef (条件编译) |
程序结构优化 | 模块化、减少全局变量、合理使用 static |
这章是 C 语言的核心内容,掌握后可以编写更结构化、可维护的代码。