转换函数以确定运算符优先级从C#到C ++

PC卢迪特

我需要将一些代码从C#转换为C / C ++。该功能的作用是确定数学评估的运算符优先级。

private static int OperatorPrecedence(string strOp)
{
    switch (strOp)
    {
        case "*":
        case "/":
        case "%": return 0;
        case "+":
        case "-": return 1;
        case ">>":
        case "<<": return 2;
        case "<":
        case "<=":
        case ">":
        case ">=": return 3;
        case "==":
        case "=":
        case "!=": return 4;
        case "&": return 5;
        case "^": return 6;
        case "|": return 7;
        case "&&": return 8;
        case "||": return 9;
    }
    throw new ArgumentException("Operator " + strOp + "not defined.");
}

我意识到有关C ++中switch语句中的字符串的众多问题,但这并不是我真正要问的。显然,switch(string)语法在C ++中是不合法的。我不想使用它。我只需要一种有效的方法来确定上述运算符的优先级,而不必在程序或大型if-else链(实际上只是在swiitch语句周围跳舞)的开头初始化整个映射。

有什么想法可以确定运算符优先级吗?也许是一种为每个操作员生成唯一代码的方法?

丹尼尔森·阿莫林(Denilson Amorim)

如在此C#答案中所指定的,根据情况的不同,带有字符串的开关将编译为字典查找或if-else链。

C ++中的字典类型为std::map,您可以在范围内使用静态字典,然后在其中进行搜索。

因此,按照这些原则,直接进行等效的1:1转换是:

int OperatorPrecedence(const std::string& strOp)
{
    static std::map<std::string, int> lookup = { {"*", 1}, {"/", 1} /* add more */ }; 
    auto it = lookup.find(strOp);
    if(it != lookup.end())
        return it->second;
    else
        throw std::invalid_argument(std::string("Operator ") + strOp + "not defined");
}

在这里使用静态存储的字典而不是具有自动存储持续时间的字典的优点是,不必在每次请求时都初始化容器(分配!)OperatorPrecedence

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++转换运算符与构造函数优先级,编译器有所不同

来自分类Dev

C ++运算符优先级和return语句

来自分类Dev

C ++ std :: cout和<<运算符,优先级

来自分类Dev

类型转换运算符优先级

来自分类Dev

C中的移位运算符优先级

来自分类Dev

Haskell中的运算符和函数优先级

来自分类Dev

C#预处理程序指令中运算符的优先级是什么?

来自分类Dev

c中运算符的优先级

来自分类Dev

在C中进行类型转换时的运算符优先级

来自分类Dev

比较运算符重载与转换运算符的C ++优先级

来自分类Dev

模板转换运算符的优先级和常数

来自分类Dev

C中运算符优先级的奇怪结果

来自分类Dev

C ++中的运算符优先级

来自分类Dev

C ++逗号运算符的优先级

来自分类Dev

C中的短路和运算符优先级

来自分类Dev

C ++:Stroustrup示例中的运算符优先级

来自分类Dev

Haskell中的运算符与匿名函数优先级

来自分类Dev

C运算符中的优先级==和(=)

来自分类Dev

C ++与C#运算符优先级

来自分类Dev

c中运算符的优先级

来自分类Dev

C#中的运算符优先级和关联性

来自分类Dev

C ++流和运算符>>优先级

来自分类Dev

输出流中的C ++运算符优先级

来自分类Dev

C解释中的运算符优先级

来自分类Dev

C 中的优先级运算符

来自分类Dev

C++ 后缀运算符优先级与布尔 AND

来自分类Dev

C中的运算符优先级?

来自分类Dev

带有函数指针的 C++ 运算符优先级

来自分类Dev

C中'or'和'and'运算符的优先级