一种可能的方法是将其放入符号数学程序(如Mathematica或Maple)中,并让它为您进行简化。无论它们是否为常量,它都会执行此操作。
缺点是您需要将代码转换为不同的语言。(虽然如果语法相似,它可以大部分复制和粘贴。)此外,如果您希望某些整数类型在特定大小时溢出,则可能会很危险。符号数学程序不关心并将根据“数学”进行优化。浮点舍入误差也是同样的情况。
在您的示例中,如果您将其输入Mathematica中:
a = 3;
b = 4;
c = a + b;
d = c;
c
将在Mathematica中输出此内容:
7
当然你不能直接复制粘贴,因为这是一种不同的语言和不同的语法,但这是我对你的问题所能想到的最好的方法。我自己使用Mathematica来简化表达式和其他数学内容,然后再将其投入C/C++中。
对于涉及未知数的更复杂的示例:
原始的C代码:
int a = 3 + x*x;
int b = 4 + y*y;
int c = a + b - 7 + 2*x*y;
int d = c;
将以下内容输入Mathematica中(大部分仍需复制粘贴):
a = 3 + x*x;
b = 4 + y*y;
c = a + b - 7 + 2*x*y;
d = c;
FullSimplify[c]
输出:
(x + y)^2
它转换回以下的C代码:
d = (x + y)
d = d * d;
这显然比原始代码简单得多。一般来说,符号程序甚至能处理非平凡表达式,并且会做得很好(甚至更好),比任何编译器内部都要好。
最后一个缺点是,像Mathematica或Maple这样的符号数学程序并不免费,而且相当昂贵。SAGE是一个开源程序,但我听说它不如Mathematica或Maple好。