是否可以使用#define解析数学表达式?

时间:2013-02-28 14:27:05

标签: objective-c macros c-preprocessor

我想制作一个科学计算器,用户输入3 + 4 *(3-5)/ 2 3 之类的东西,然后计算器可以返回该值。 现在我正试图找到一种方法来解析一串数学表达式。我知道有一些内置的解析器和算法,但我想知道是否可以使用#define方法。 基本上,我想使用#define逐字地删除字符串中的@和“”,使其看起来像一个可以计算的表达式。在这个阶段,我不会使用未知的变量,如x或3 * k或a * b / c。所有都是数字和运算符,如3 + 4和3 2 ,可以由编译器直接评估。以下是我想在#define中写的内容:

#define eval@"(x)" x

在上面的代码中,eval只是解析的信号,@“x”是需要解析的实际字符串,x是数学表达式。翻译后,只剩下x。例如,如果我写

double result = eval@"(3+4)";

编译器将读取

double result = 3+4;

(根据我对#define的理解)。但是,代码不起作用。我怀疑引号会混淆编译器并导致代码中断。所以我的问题是:任何人都可以使用#define提出解决方案吗?

3 个答案:

答案 0 :(得分:3)

使用预处理器是不可能的,除了支持连接之外没有字符串操作。

为什么你还需要@“x”语法?您可以将表达式放在代码中。

答案 1 :(得分:2)

人们是对的,你不能直接这样做,但如果你非常想要宏:

#define eval(x) [[[NSExpression expressionWithFormat:x] expressionValueWithObject:nil context:nil] doubleValue]

double result = eval(@"3+4");

答案 2 :(得分:1)

#define是C预处理器的调用,它不能进行这种操作。这听起来好像你正在尝试定义一个与LISP宏做同样事情的Objective-C宏,但这是不可能的。你为什么不告诉我们what the original problem is你要解决的问题......我想我们可能会想出一个更容易的方法来做你想做的事。