如何重新排序算术运算符的 C++ 标准优先级,以便减法具有更高的优先级
How to reorder the C++ standard precedence of arithmetic operators, so that subtraction will have higher priority
我想做一个计算器,它会问你算术的优先级 operators.For 例如优先级 №1 用于加法,№2 用于除法,№3 用于减法,№4 用于乘法。
问题是:我需要使用重载运算符还是只使用括号?
运算符重载时不能操纵运算符的优先级。
通常,运算符优先级被硬连接到与您的表达式关联的 语法 中。例如在 C++ 中就是这种情况。
您的项目面临的挑战是您希望在 运行 时间使语法灵活。此时,您遇到了 动态编程语言 。请参阅 https://en.wikipedia.org/wiki/Dynamic_programming_language 以进一步阅读。
你想做的当然是可能的,但你必须小心构建解析器和词法分析器。
实际上,您可以实现与使用运算符重载来操纵运算符的优先级相同的效果 - 这将涉及引入您自己的 classes 并对其执行操作。
当实现一个你想降低其优先级的操作时,你可以通过存储 2 个值并存储操作或返回特定于该操作的 class 来实现它。
转换回结果时,您可以按所选顺序应用存储的操作。
+ 优先级高于 * 的示例:-
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)
}
但是在您的问题中,您说了一些关于仅使用括号的内容 - 我不清楚您在做什么,但如果您仅通过添加括号就可以做到,那么听起来更简单。
我想做一个计算器,它会问你算术的优先级 operators.For 例如优先级 №1 用于加法,№2 用于除法,№3 用于减法,№4 用于乘法。 问题是:我需要使用重载运算符还是只使用括号?
运算符重载时不能操纵运算符的优先级。
通常,运算符优先级被硬连接到与您的表达式关联的 语法 中。例如在 C++ 中就是这种情况。
您的项目面临的挑战是您希望在 运行 时间使语法灵活。此时,您遇到了 动态编程语言 。请参阅 https://en.wikipedia.org/wiki/Dynamic_programming_language 以进一步阅读。
你想做的当然是可能的,但你必须小心构建解析器和词法分析器。
实际上,您可以实现与使用运算符重载来操纵运算符的优先级相同的效果 - 这将涉及引入您自己的 classes 并对其执行操作。
当实现一个你想降低其优先级的操作时,你可以通过存储 2 个值并存储操作或返回特定于该操作的 class 来实现它。 转换回结果时,您可以按所选顺序应用存储的操作。
+ 优先级高于 * 的示例:-
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)
}
但是在您的问题中,您说了一些关于仅使用括号的内容 - 我不清楚您在做什么,但如果您仅通过添加括号就可以做到,那么听起来更简单。