You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言四则计算器中使用函数指针优化现有代码结构

函数指针改造简易计算器方案

改造核心思路

原有代码通过多层if判断匹配运算符执行对应逻辑,扩展性和可读性较差,我们可以通过运算映射表+函数指针的方案优化结构:

  1. 为所有运算函数定义统一的函数签名:int (*op_handler)(int, int)
  2. 封装每个运算符的独立处理函数,把除零判断逻辑收敛到除法、取模的专属函数中
  3. 定义运算符与处理函数的映射表,直接通过查表匹配调用对应逻辑,无需冗余条件判断

改造后完整代码

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 00:42:03