如何简化三个变量多类型运算组合求值的程序代码
核心实现思路
- 三个变量做二元运算需要2个运算符位置,每个位置有6种运算符可选,总共有6*6=36种组合,完全不需要逐个手写表达式。你提到的「把运算符存入数组遍历替换」的思路完全可行,是最优的实现方案。
- 计算时注意遵循所用编程语言的默认运算符优先级,比如
*优先级高于加减、位运算优先级低于算术运算,避免自行强制左序计算导致和手写表达式结果不一致。
最简实现示例(Python)
直接拼接表达式字符串调用eval计算,完全复用原生运算符优先级逻辑,代码量最少:
# 自定义变量值 a = 5 b = 3 c = 2 # 运算符列表 op_list = ['+', '-', '*', '&', '|', '^'] # 遍历所有运算符组合 for op1 in op_list: for op2 in op_list: expr = f"{a} {op1} {b} {op2} {c}" res = eval(expr) print(f"{expr} = {res}")
如果你的使用场景存在不可信输入,担心eval的安全问题,可以用运算符映射的方式手动处理运算逻辑,示例如下:
import operator from itertools import product a = 5 b = 3 c = 2 # 运算符与对应运算函数的映射 op_map = [ ('+', operator.add), ('-', operator.sub), ('*', operator.mul), ('&', operator.and_), ('|', operator.or_), ('^', operator.xor), ] # 遍历所有运算符组合,按左序计算(如需匹配原生优先级,可自行补充优先级判断逻辑) for (op1_str, op1_func), (op2_str, op2_func) in product(op_map, repeat=2): step1 = op1_func(a, b) res = op2_func(step1, c) print(f"{a} {op1_str} {b} {op2_str} {c} = {res}")
其他语言适配方案
- 支持
eval类语法的语言(JavaScript、PHP等),都可以参考上面拼接表达式的方式实现,代码最精简。 - 不支持
eval或对性能要求极高的场景,可以定义运算符结构体存储符号、优先级、运算匿名函数,遍历组合后按优先级判断运算顺序再计算;也可以用宏/元编程在编译期生成所有表达式,运行期无额外开销。
内容的提问来源于stack exchange,提问作者th3r4t3l
相关产品推荐
相关产品推荐

