如何在C语言四则计算器中使用函数指针优化现有代码结构
函数指针改造简易计算器方案
改造核心思路
原有代码通过多层if判断匹配运算符执行对应逻辑,扩展性和可读性较差,我们可以通过运算映射表+函数指针的方案优化结构:
- 为所有运算函数定义统一的函数签名:
int (*op_handler)(int, int) - 封装每个运算符的独立处理函数,把除零判断逻辑收敛到除法、取模的专属函数中
- 定义运算符与处理函数的映射表,直接通过查表匹配调用对应逻辑,无需冗余条件判断
改造后完整代码
#include <unistd.h> int ft_atoi(char *str); void ft_putnbr(int nb); /* 各运算独立处理函数 */ static int op_add(int a, int b) { return a + b; } static int op_sub(int a, int b) { return a - b; } static int op_mul(int a, int b) { return a * b; } static int op_div(int a, int b) { if (b == 0) { write(1, "Stop : division by zero\n", 24); return -1; } return a / b; } static int op_mod(int a, int b) { if (b == 0) { write(1, "Stop : modulo by zero\n", 22); return -1; } return a % b; } /* 运算符-处理函数映射结构体 */ typedef struct s_op_map { char op; int (*handler)(int, int); } t_op_map; int main(int ac, char **av) { int value1, value2, res; char op; /* 运算映射表,新增运算只需在这里加对应项即可 */ t_op_map op_map[] = { {'+', op_add}, {'-', op_sub}, {'*', op_mul}, {'/', op_div}, {'%', op_mod}, {0, NULL} // 结束标记 }; int i = 0; if (ac != 4) return 0; value1 = ft_atoi(av[1]); value2 = ft_atoi(av[3]); op = av[2][0]; if (av[2][1] != 0) { ft_putnbr(0); write(1, "\n", 1); return 0; } /* 查表匹配运算符 */ res = 0; while (op_map[i].op != 0) { if (op_map[i].op == op) { res = op_map[i].handler(value1, value2); break; } i++; } if (res != -1) { ft_putnbr(res); write(1, "\n", 1); } return 0; }
改造优势
- 消除冗余的多层if分支,代码逻辑更直观可读
- 扩展性极强,后续新增运算仅需编写对应处理函数、在映射表新增一行记录即可,无需修改核心执行逻辑
- 各运算逻辑完全解耦,修改某类运算的规则不会影响其他运算的运行
内容的提问来源于stack exchange,提问作者hugo hg
相关产品推荐
相关产品推荐

