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 に答える