函数的定义与调用

函数的创建与使用

函数的定义与调用是C语言编程的核心技能。东巴文(db-w.cn) 将带你深入理解函数的定义与调用,掌握函数编程的基础技能。

💡 东巴文观点:函数定义是创建功能,函数调用是使用功能,两者相辅相成。

函数的定义

基本语法

东巴文语法

返回类型 函数名(参数列表) {
    // 函数体
    return 返回值;
}

东巴文说明

  • 返回类型:函数返回值的数据类型
  • 函数名:函数的标识符,遵循命名规则
  • 参数列表:函数接收的输入参数
  • 函数体:完成特定任务的代码
  • 返回值:函数返回的结果

函数定义示例

#include <stdio.h>

// 无参数无返回值
void printHello() {
    printf("东巴文欢迎您!\n");
}

// 有参数无返回值
void printNumber(int num) {
    printf("数字:%d\n", num);
}

// 无参数有返回值
int getNumber() {
    return 42;
}

// 有参数有返回值
int add(int a, int b) {
    return a + b;
}

int main() {
    printf("=== 东巴文函数定义示例 ===\n\n");
    
    // 调用无参数无返回值函数
    printHello();
    
    // 调用有参数无返回值函数
    printNumber(10);
    
    // 调用无参数有返回值函数
    int num = getNumber();
    printf("获取的数字:%d\n", num);
    
    // 调用有参数有返回值函数
    int sum = add(5, 3);
    printf("5 + 3 = %d\n", sum);
    
    return 0;
}

函数的组成部分

#include <stdio.h>

// 函数声明(原型)
int max(int a, int b);

int main() {
    int result = max(10, 5);
    printf("最大值:%d\n", result);
    return 0;
}

// 函数定义
int max(int a, int b) {
    // 函数体
    if (a > b) {
        return a;  // 返回语句
    } else {
        return b;
    }
}

东巴文说明

  • 函数声明:告诉编译器函数的存在
  • 函数定义:函数的具体实现
  • 函数调用:使用函数完成特定任务

函数的声明

什么是函数声明?

东巴文说明:函数声明告诉编译器函数的存在,包括函数名、返回类型和参数列表。

函数声明语法

返回类型 函数名(参数列表);

函数声明示例

#include <stdio.h>

// 函数声明
int add(int a, int b);
void printMessage(void);

int main() {
    int result = add(5, 3);
    printf("结果:%d\n", result);
    
    printMessage();
    
    return 0;
}

// 函数定义
int add(int a, int b) {
    return a + b;
}

void printMessage(void) {
    printf("东巴文欢迎您!\n");
}

函数声明的位置

#include <stdio.h>

// 方法1:在文件开头声明
int func1(int a, int b);
int func2(int a, int b);

int main() {
    printf("%d\n", func1(5, 3));
    printf("%d\n", func2(5, 3));
    return 0;
}

int func1(int a, int b) {
    return a + b;
}

int func2(int a, int b) {
    return a * b;
}

函数声明的作用

东巴文函数声明作用

  1. 提前告知:告诉编译器函数的存在
  2. 类型检查:编译器可以检查函数调用的类型
  3. 代码组织:可以将函数定义放在任何位置
#include <stdio.h>

// 函数声明
int calculate(int a, int b, char op);

int main() {
    printf("=== 东巴文函数声明作用 ===\n\n");
    
    printf("5 + 3 = %d\n", calculate(5, 3, '+'));
    printf("5 - 3 = %d\n", calculate(5, 3, '-'));
    printf("5 * 3 = %d\n", calculate(5, 3, '*'));
    printf("5 / 3 = %d\n", calculate(5, 3, '/'));
    
    return 0;
}

// 函数定义
int calculate(int a, int b, char op) {
    switch (op) {
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': return b != 0 ? a / b : 0;
        default: return 0;
    }
}

函数的调用

什么是函数调用?

东巴文说明:函数调用是执行函数代码的过程。

函数调用语法

函数名(实参列表);

函数调用示例

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    printf("=== 东巴文函数调用示例 ===\n\n");
    
    // 直接调用
    printf("直接调用:%d\n", add(5, 3));
    
    // 赋值调用
    int result = add(10, 20);
    printf("赋值调用:%d\n", result);
    
    // 表达式中调用
    int total = add(1, 2) + add(3, 4);
    printf("表达式调用:%d\n", total);
    
    // 嵌套调用
    printf("嵌套调用:%d\n", add(add(1, 2), add(3, 4)));
    
    return 0;
}

函数调用的执行过程

#include <stdio.h>

void printLine() {
    printf("--------------------\n");
}

int add(int a, int b) {
    printf("计算 %d + %d\n", a, b);
    return a + b;
}

int main() {
    printf("=== 东巴文函数调用过程 ===\n\n");
    
    printLine();
    
    int x = 5, y = 3;
    printf("调用add函数前\n");
    
    int result = add(x, y);
    
    printf("调用add函数后\n");
    printf("结果:%d\n", result);
    
    printLine();
    
    return 0;
}

东巴文执行流程

main函数开始
  ↓
调用printLine函数
  ↓
执行printLine函数体
  ↓
返回main函数
  ↓
调用add函数
  ↓
执行add函数体
  ↓
返回结果到main函数
  ↓
main函数结束

函数调用的方式

#include <stdio.h>

// 函数声明
int square(int n);
void printResult(int result);

int main() {
    printf("=== 东巴文函数调用方式 ===\n\n");
    
    // 1. 函数语句
    printResult(100);
    
    // 2. 函数表达式
    int result = square(5) + 10;
    printf("表达式结果:%d\n", result);
    
    // 3. 函数参数
    printf("平方值:%d\n", square(5));
    
    // 4. 嵌套调用
    printf("嵌套调用:%d\n", square(square(2)));
    
    return 0;
}

int square(int n) {
    return n * n;
}

void printResult(int result) {
    printf("结果:%d\n", result);
}

函数的嵌套调用

什么是嵌套调用?

东巴文说明:嵌套调用是指在一个函数调用中使用另一个函数调用的结果。

嵌套调用示例

#include <stdio.h>

int max(int a, int b) {
    return a > b ? a : b;
}

int max3(int a, int b, int c) {
    return max(max(a, b), c);
}

int max4(int a, int b, int c, int d) {
    return max(max3(a, b, c), d);
}

int main() {
    printf("=== 东巴文嵌套调用示例 ===\n\n");
    
    printf("max(3, 5) = %d\n", max(3, 5));
    printf("max3(3, 5, 7) = %d\n", max3(3, 5, 7));
    printf("max4(3, 5, 7, 9) = %d\n", max4(3, 5, 7, 9));
    
    return 0;
}

嵌套调用的执行过程

#include <stdio.h>

int add(int a, int b) {
    printf("add(%d, %d)\n", a, b);
    return a + b;
}

int multiply(int a, int b) {
    printf("multiply(%d, %d)\n", a, b);
    return a * b;
}

int main() {
    printf("=== 东巴文嵌套调用执行过程 ===\n\n");
    
    // 嵌套调用:add(add(1, 2), multiply(3, 4))
    int result = add(add(1, 2), multiply(3, 4));
    printf("最终结果:%d\n", result);
    
    return 0;
}

东巴文执行顺序

1. add(1, 2) → 3
2. multiply(3, 4) → 12
3. add(3, 12) → 15

函数的链式调用

什么是链式调用?

东巴文说明:链式调用是指将多个函数调用连接在一起,前一个函数的返回值作为后一个函数的参数。

链式调用示例

#include <stdio.h>

int add(int n) {
    static int sum = 0;
    sum += n;
    return sum;
}

int main() {
    printf("=== 东巴文链式调用示例 ===\n\n");
    
    // 链式调用
    int result = add(1) + add(2) + add(3);
    printf("链式调用结果:%d\n", result);
    
    return 0;
}

函数的递归调用

什么是递归调用?

东巴文说明:递归调用是指函数直接或间接调用自身。

递归调用示例

#include <stdio.h>

// 计算阶乘
long factorial(int n) {
    if (n <= 1) {
        return 1;  // 基准情况
    }
    return n * factorial(n - 1);  // 递归调用
}

// 计算斐波那契数列
long fibonacci(int n) {
    if (n <= 1) {
        return n;  // 基准情况
    }
    return fibonacci(n - 1) + fibonacci(n - 2);  // 递归调用
}

int main() {
    printf("=== 东巴文递归调用示例 ===\n\n");
    
    // 阶乘
    printf("5! = %ld\n", factorial(5));
    printf("10! = %ld\n", factorial(10));
    
    // 斐波那契数列
    printf("\n斐波那契数列前10项:\n");
    for (int i = 0; i < 10; i++) {
        printf("%ld ", fibonacci(i));
    }
    printf("\n");
    
    return 0;
}

递归的条件

东巴文递归条件

  1. 基准情况:至少有一个基准情况,避免无限递归
  2. 递归调用:每次递归调用都应该向基准情况靠近
  3. 终止条件:递归调用最终会到达基准情况
#include <stdio.h>

// ❌ 错误的递归:没有基准情况
void infiniteRecursion() {
    printf("无限递归\n");
    infiniteRecursion();  // 无限递归
}

// ✅ 正确的递归:有基准情况
void countdown(int n) {
    if (n <= 0) {  // 基准情况
        printf("发射!\n");
        return;
    }
    printf("%d\n", n);
    countdown(n - 1);  // 向基准情况靠近
}

int main() {
    printf("=== 东巴文递归条件 ===\n\n");
    
    countdown(5);
    
    return 0;
}

东巴文最佳实践

1. 函数声明与定义分离

#include <stdio.h>

// 函数声明
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
int divide(int a, int b);

int main() {
    printf("5 + 3 = %d\n", add(5, 3));
    printf("5 - 3 = %d\n", subtract(5, 3));
    printf("5 * 3 = %d\n", multiply(5, 3));
    printf("5 / 3 = %d\n", divide(5, 3));
    return 0;
}

// 函数定义
int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int multiply(int a, int b) {
    return a * b;
}

int divide(int a, int b) {
    return b != 0 ? a / b : 0;
}

2. 函数调用前检查

#include <stdio.h>

int divide(int a, int b, int *result) {
    if (b == 0) {
        return -1;  // 错误:除数为0
    }
    if (result == NULL) {
        return -2;  // 错误:空指针
    }
    
    *result = a / b;
    return 0;  // 成功
}

int main() {
    int result;
    
    if (divide(10, 2, &result) == 0) {
        printf("10 / 2 = %d\n", result);
    } else {
        printf("除法失败\n");
    }
    
    return 0;
}

3. 避免过深的嵌套调用

// ❌ 过深的嵌套调用
int result = func1(func2(func3(func4(func5(x)))));

// ✅ 分步调用
int temp1 = func5(x);
int temp2 = func4(temp1);
int temp3 = func3(temp2);
int temp4 = func2(temp3);
int result = func1(temp4);

4. 合理使用递归

// ✅ 适合递归的场景
int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

// ✅ 递归改循环(效率更高)
int factorial_iterative(int n) {
    int result = 1;
    for (int i = 2; i <= n; i++) {
        result *= i;
    }
    return result;
}

东巴文验证清单

完成本章学习后,请确认:

  • 掌握函数的定义
  • 掌握函数的声明
  • 掌握函数的调用
  • 理解函数调用的执行过程
  • 掌握函数的嵌套调用
  • 了解函数的链式调用
  • 掌握函数的递归调用
  • 了解函数的最佳实践

下一步学习

掌握函数的定义与调用后,你可以继续学习:

如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!


东巴文(db-w.cn) - 让编程学习更简单

📦 东巴文函数定义与调用提示:函数定义与调用是函数编程的基础,掌握它们是编写模块化程序的关键。在 db-w.cn,我们会通过大量实例帮你掌握函数的定义与调用!