【问题标题】:is there a way i can convert an operator as a char "+" into the actual operator for arithmetic?有没有办法可以将运算符作为字符“+”转换为实际的算术运算符?
【发布时间】:2013-10-08 08:05:44
【问题描述】:

如何将字符“+”转换为 + 以进行加法?我正在尝试做一些让用户输入运算符 +-*/ 然后打印运算符 b 的事情。

我可以只做一堆 if 语句,但想知道是否有办法更有效地做到这一点?

if (operator == "+") {cout << a + b;}
else if (operator == "-") {cout << a - b;}

等等。

【问题讨论】:

  • 对于一个简单的表达式解析器,它不会比这更简单。简单是好的,因为它使您的程序可维护。在大多数情况下,IMO 简单胜过高效。
  • 声明 :char op; 然后使用 if(op == '+') { etc }
  • 您当前的解决方案效率低吗?您是否对其进行了分析并确定“一堆 if 语句”是瓶颈?
  • 我希望你知道operator是一个关键词。
  • 看起来像 XY problem。你想达到什么目的?写一个 LR 解析器来评估表达式?语言翻译?

标签: c++


【解决方案1】:

使用开关假设 token 是一个字符,您可以在其中获取运算符,op1op2 是 2 个操作数:

switch (token)
{
    case '/':
        val = op1 / op2;
        break;
    case '*':
        val = op1 * op2;
        break;
    case '+':
        val = op1 + op2;
        break;
    case '-':
        val = op1 - op2;
        break;
}

【讨论】:

    【解决方案2】:

    您可以使用带有函数指针的映射。

    int addition(int a, int b){
      return a + b;
    }
    
    std::map<char, int(*)(int, int)> operators;
    operators.insert(make_pair('+', addition));
    
    char c = getch();
    int first_operand = 10;
    int second_operand = 20;
    
    int result = operators[c](first_operand, second_operand);
    

    【讨论】:

    • 尽可能首选列表初始化!
    • std::function&lt;T(T,T)&gt; 的地图,并利用std::plus&lt;T&gt; 等人。
    • @juanchopanza:不仅仅是std::plus,而是std::plus&lt;&gt;(来自C++14),在这种情况下,它会选择一个更通用的专业化。
    • @Nawaz 我编辑了我的评论以使其清楚。我不知道有什么专业。它是一个类模板,所以如果没有&lt;T&gt;,我看不到它如何使用。
    • @juanchopanza 不知道std::plus 等人。谢谢!
    【解决方案3】:

    我相信在这种情况下使用开关会更好。否则,解决方案对我来说似乎没问题。

    【讨论】:

      【解决方案4】:

      你也可以使用这样的地图,我认为在这种情况下效率并不重要。

      cout << operators[op](a, b);
      

      【讨论】:

        猜你喜欢
        • 2019-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多