将函数转换为确定从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#答案中所指定的,一个带有字符串的开关将根据情况的数量编译为字典查找或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
时初始化(分配!)。