第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. 程序结构建议

  1. 模块化设计:将功能拆分为多个函数和文件。
  2. 避免全局变量:尽量使用局部变量,减少副作用。
  3. 合理使用 static:限制变量/函数的作用域。
  4. 头文件保护:用 #ifndef 防止重复包含。
  5. 递归谨慎使用:确保有终止条件,避免栈溢出。

总结

主题 关键点
函数定义与调用 函数由 返回值类型函数名参数列表函数体 组成
变量作用域 局部变量(函数内)、全局变量(程序全局)、static(持久化)、extern(跨文件)
递归 函数调用自身,需有终止条件
头文件与多文件编译 .h 存放声明,#include 引入,gcc file1.c file2.c 编译
预处理器 #define(宏)、#include(头文件)、#ifdef(条件编译)
程序结构优化 模块化、减少全局变量、合理使用 static

这章是 C 语言的核心内容,掌握后可以编写更结构化、可维护的代码。

posted @ 2025-05-07 21:52  MachineGaming  阅读(14)  评论(0)    收藏  举报