Я обнаружил, что операции, которые выполняются первыми в выражении, выполняются справа налево, несмотря на приоритет операторов. Я создал простой класс для отладки:
class Integer
{
int i;
public:
Integer(int v = 0) : i(v)
{}
const Integer& operator++()
{
cout << "++integer\n";
i += 1;
return *this;
}
const Integer operator++(int)
{
cout << "integer++\n";
Integer temp(i);
i += 1;
return temp;
}
friend ostream& operator<<(ostream &os, const Integer &r);
friend const Integer operator+(const Integer &l, const Integer &r);
friend const Integer operator*(const Integer &l, const Integer &r);
};
ostream& operator<<(ostream &os, const Integer &r)
{
os << r.i;
return os;
}
const Integer operator+(const Integer &l, const Integer &r)
{
cout << "integer+integer " << l.i << ' ' << r.i << "\n";
return Integer(l.i + r.i);
}
const Integer operator*(const Integer &l, const Integer &r)
{
cout << "integer*integer " << l.i << ' ' << r.i << "\n";
return Integer(l.i * r.i);
}
И я использую это здесь (два примера):
Integer z, a(1), b(2), c(3), d(4);
z = a + a * b + ++d + b * c;
cout << z << endl;
Integer x = 3;
cout << x << ' ' << x++ << ' ' << ++x << ' ' << x + x << endl;
Выход:
integer*integer 2 3
++integer
integer*integer 1 2
integer+integer 1 2
integer+integer 3 5
integer+integer 8 6
14
integer+integer 3 3
++integer
integer++
5 4 5 6
Итак, умножение идет до приращения (несмотря на его более низкий приоритет), но результат, как мы могли ожидать. Второй случай более интересен — постинкрементация имеет более высокий приоритет, чем преинкрементация, и оба должны выполняться перед оператором +, поэтому я ожидал увидеть «5 3 5 10», но, поскольку операции выполняются справа налево, постинкрементация получает 4 как аргумент и добавление делается на базовое значение.
Я подозреваю, что у него нет побочных эффектов, пока операторы, которые изменяют объект, не используются в выражениях, но мне интересно, есть ли причина, по которой он выполняется таким образом?
Хорошо, от этот ответ:
Если не указано иное, вычисления операндов отдельных операторов и подвыражений отдельных выражений не являются последовательными
Других решений пока нет …