将函数转换为确定从c#到c++的运算符优先级

本文关键字:c++ 运算符 优先级 转换 函数 | 更新日期: 2023-09-27 17:49:30

我需要将一些代码从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++中是不合法的。我不想用它。我只需要一种有效的方法来确定上述操作符的优先级,而不是在程序开始时初始化整个map或大型if-else链(这实际上只是绕着switch语句跳来跳去)。

是否知道如何确定操作符优先级?也许是一种为每个操作符生成唯一代码的方法?

将函数转换为确定从c#到c++的运算符优先级

如本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时初始化(分配!)