【发布时间】:2018-02-17 01:50:06
【问题描述】:
我想做一个计算器,它会问你算术运算符的优先级。例如优先级№1加法,№2除法,№3减法,№4乘法。 问题是:我需要使用重载运算符还是只使用括号?
【问题讨论】:
-
C++自身的运算符优先级与你计算器语法中的运算符优先级无关。
标签: c++ string oop operators calculator
我想做一个计算器,它会问你算术运算符的优先级。例如优先级№1加法,№2除法,№3减法,№4乘法。 问题是:我需要使用重载运算符还是只使用括号?
【问题讨论】:
标签: c++ string oop operators calculator
在进行运算符重载时,不能操纵运算符的优先级。
通常,运算符优先级是硬连线到与您的表达式关联的语法中。以 C++ 为例。
您的项目面临的挑战是您想让语法在运行时灵活。在这一点上,您偶然发现了动态编程语言。如需进一步阅读,请参阅https://en.wikipedia.org/wiki/Dynamic_programming_language。
您想要做的当然是可能的,但您必须小心构建解析器和词法分析器的方式。
【讨论】:
实际上,您可以实现相当于使用运算符重载来操纵运算符的优先级 - 这将涉及引入您自己的类并对它们执行操作。
在实现要降低优先级的操作时,您可以通过存储 2 个值并存储该操作或返回特定于该操作的类来实现它。 转换回结果时,您可以按照您选择的顺序应用存储的操作。
+ 优先级高于 * 的示例:-
struct Multiple;
struct Number
{
Number(double val)
: m_Val(val)
{}
friend double operator+(const Multiple& left, const Number& right);
friend Multiple operator*(const Number& left, const Number& right);
private:
double m_Val;
};
struct Multiple
{
Multiple(double left, double right)
: m_left(left),
m_right(right)
{}
friend double operator+(const Multiple& left, const Number& right);
private:
double m_left;
double m_right;
};
Multiple operator*(const Number& left, const Number& right)
{
return Multiple(left.m_Val, right.m_Val);
}
double operator+(const Multiple& a, const Number& b)
{
return a.m_left * (a.m_right + b.m_Val);
}
void main()
{
Number a(3);
Number b(1);
Number c(2);
double d = a * b + c;
// d = 9 (not 5)
}
但是在您的问题中,您说了一些关于仅使用括号的内容-我不清楚您在做什么,但是如果您可以仅通过添加括号来做到这一点,那听起来就更简单了。
【讨论】: