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

C语言能否将算术运算符存为变量,减少逆波兰计算器的switch分支?

问题解答

C语言原生支持性说明

C语言本身不支持将运算符作为变量存储后直接代入表达式执行。C是静态编译语言,所有运算符的语义在编译阶段就会被解析为对应的CPU操作指令,运行阶段不存在可被动态调用的“运算符实体”,你要求的a = b op c这种直接拼接运算符变量的写法原生是不支持的。

替代实现方案(比switch更易维护)

你可以用函数指针查找表来实现需求,比堆叠switch分支扩展性更强,新增运算符只需要加一行表项即可,不需要修改分支逻辑。
实现思路:

  • 定义统一的运算函数签名,所有二元运算的函数都遵循这个签名
  • 构建运算符字符和对应处理函数的映射表
  • 读取到输入的运算符后,查表找到对应的函数执行即可

示例代码:

#include <stdio.h>

// 定义二元运算函数的签名
typedef int (*BinaryOp)(int, int);

// 各个运算符的实现函数
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) { return b ? a / b : 0; } // 简单处理除零场景

// 运算符-函数映射表
typedef struct {
    char op;
    BinaryOp handler;
} OpMap;

OpMap op_map[] = {
    {'+', add},
    {'-', sub},
    {'*', mul},
    {'/', div},
    // 新增运算符仅需在此添加表项,比如加%取模就新增一行{'%', mod}
};

int main() {
    int b = 10, c = 3;
    char input_op = '+'; // 此处可替换为实际读取到的用户输入运算符
    int a = 0;

    // 查表执行对应运算
    int map_size = sizeof(op_map) / sizeof(op_map[0]);
    for (int i = 0; i < map_size; i++) {
        if (op_map[i].op == input_op) {
            a = op_map[i].handler(b, c);
            break;
        }
    }

    printf("计算结果:%d\n", a); // 输入+时输出13,输入*时输出30
    return 0;
}

方案选型建议

  • 如果你只需要支持3、4个基础算术运算符,直接写switch也完全够用,两者代码量差异不大
  • 如果后续要扩展大量运算符(比如位运算、自定义运算等),查找表方案的维护成本会低很多

内容的提问来源于stack exchange,提问作者hjhbb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:06:01