Menu
CoddyTech

将函数作为参数传递

本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 36 课,共 61 课。

函数指针最强大的用途之一,是将其作为参数传递给其他函数。这样你就能在不修改函数代码的情况下,为函数注入自定义行为:这种技术有时称为回调。

考虑一个对两个数字进行计算的函数。你可以接受一个函数指针来指定要执行的运算,而不是将运算写死:

typedef int (*Operation)(int, int);

int compute(int a, int b, Operation op) {
    return op(a, b);
}

compute 函数不知道自己是在做加法、减法,还是完全不同的运算。它只会调用传递给它的函数:

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

int main() {
    printf("%d\n", compute(5, 3, add));       // 输出:8
    printf("%d\n", compute(5, 3, multiply));  // 输出:15
    return 0;
}

注意,同一个 compute 函数会根据我们传入的函数产生不同的结果。这种模式是编写灵活、可复用代码的基础。你只需编写一次结构,函数的使用者就可以提供他们需要的具体逻辑。

challenge icon

挑战

简单

编写一个函数 apply_twice,它接收两个整数和一个操作代码,依次对这些数字执行两次操作,并返回最终结果。

你的函数会接收一个操作代码,用来确定要使用哪种操作。你必须在答案中定义操作函数,并将它们传递给辅助函数 compute,该函数接收一个函数指针。

注意:只需要编写这些函数。测试会直接调用 apply_twice 并检查它的返回值,所以不要读取输入或打印任何内容。

必需的结构:

  • 定义一个名为 Operation 的 typedef,表示一个函数指针,该指针指向的函数接收两个 int 参数并返回一个 int
  • 定义两个操作函数:add(返回 a + b)和 multiply(返回 a * b)
  • 定义一个 compute 函数,它接收两个整数和一个 Operation 函数指针,然后返回调用该操作的结果
  • 在 apply_twice 中,根据操作代码选择合适的操作,然后调用两次 compute:第一次使用原始数字,第二次使用计算结果和第二个数字

逻辑:

  1. 根据 op_code 选择操作函数(1 = add,2 = multiply)
  2. 调用 compute(a, b, operation),得到中间结果
  3. 调用 compute(intermediate, b, operation),得到最终结果
  4. 返回最终结果

参数:

  • a(int):第一个数字
  • b(int):第二个数字
  • op_code(int):操作代码(1 表示 add,2 表示 multiply)

返回值:依次执行两次操作后的结果(int)

示例:当 a = 5、b = 3、op_code = 1(add)时:

  • 第一次计算:5 + 3 = 8
  • 第二次计算:8 + 3 = 11
  • 返回:11

当 a = 2、b = 4、op_code = 2(multiply)时:

  • 第一次计算:2 × 4 = 8
  • 第二次计算:8 × 4 = 32
  • 返回:32

亲手试试

int apply_twice(int a, int b, int op_code) {
    // 在这里编写代码
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C 在线编译器