将函数作为参数传递
本课属于 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 函数会根据我们传入的函数产生不同的结果。这种模式是编写灵活、可复用代码的基础。你只需编写一次结构,函数的使用者就可以提供他们需要的具体逻辑。
挑战
简单编写一个函数 apply_twice,它接收两个整数和一个操作代码,依次对这些数字执行两次操作,并返回最终结果。
你的函数会接收一个操作代码,用来确定要使用哪种操作。你必须在答案中定义操作函数,并将它们传递给辅助函数 compute,该函数接收一个函数指针。
注意:只需要编写这些函数。测试会直接调用 apply_twice 并检查它的返回值,所以不要读取输入或打印任何内容。
必需的结构:
- 定义一个名为
Operation的typedef,表示一个函数指针,该指针指向的函数接收两个int参数并返回一个int - 定义两个操作函数:
add(返回 a + b)和multiply(返回 a * b) - 定义一个
compute函数,它接收两个整数和一个Operation函数指针,然后返回调用该操作的结果 - 在
apply_twice中,根据操作代码选择合适的操作,然后调用两次compute:第一次使用原始数字,第二次使用计算结果和第二个数字
逻辑:
- 根据
op_code选择操作函数(1 = add,2 = multiply) - 调用
compute(a, b, operation),得到中间结果 - 调用
compute(intermediate, b, operation),得到最终结果 - 返回最终结果
参数:
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) {
// 在这里编写代码
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C 在线编译器