如何重新排序算术运算符的 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)
}

但是在您的问题中,您说了一些关于仅使用括号的内容 - 我不清楚您在做什么,但如果您仅通过添加括号就可以做到,那么听起来更简单。