0

我想制作一个科学计算器,用户在其中输入类似 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吗?

4

3 回答 3

3

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

为什么你仍然需要 @"x" 语法?您可以将表达式直接放在代码中。

于 2013-02-28T14:36:59.213 回答
2

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

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

double result = eval(@"3+4");
于 2013-02-28T14:52:50.900 回答
1

#define是 C 预处理器的调用,它不能进行这种操作。听起来您几乎是在尝试定义一个与 LISP 宏做同样事情的 Objective-C 宏,但这是不可能的。您为什么不告诉我们您要解决的原始问题是什么……我认为我们可能会想出一种更简单的方法来做您想做的事情。

于 2013-02-28T14:41:25.547 回答