Почему следующая печать bD aD aB aA aC aU
вместо aD aB aA aC bD aU
? Другими словами, почему b--
оценивается до --++a--++
?
#include <iostream>
using namespace std;
class A {
char c_;
public:
A(char c) : c_(c) {}
A& operator++() {
cout << c_ << "A ";
return *this;
}
A& operator++(int) {
cout << c_ << "B ";
return *this;
}
A& operator--() {
cout << c_ << "C ";
return *this;
}
A& operator--(int) {
cout << c_ << "D ";
return *this;
}
void operator+(A& b) {
cout << c_ << "U ";
}
};
int main()
{
A a('a'), b('b');
--++a-- ++ +b--; // the culprit
}
Из того, что я собираю, вот как выражение анализируется компилятором:
- Маркировка препроцессора:
--
++
a
--
++
+
b
--
; - Приоритет оператора 1:
(--(++((a--)++))) + (b--)
; -
+
является ассоциацией слева направо, но тем не менее компилятор может сначала оценить выражение справа (b--
).
Я предполагаю, что компилятор решил сделать это так, потому что это приводит к улучшению оптимизированного кода (меньше инструкций). Однако стоит отметить, что я получаю тот же результат при компиляции с /Od
(MSVC) и -O0
(GCC). Это подводит меня к моему вопросу:
Поскольку меня попросили об этом на тесте, который в принципе должен быть реализацией/компилятором-агностиком, есть ли что-то в стандарте С++, который предписывает вышеуказанное поведение, или это действительно неуказано? Может кто-то цитата из выдержки из стандарта, которая подтверждает или? Неправильно ли было иметь такой вопрос в тесте?
1 Я понимаю, что компилятор действительно не знает о приоритете или ассоциативности операторов, скорее, он заботится только о языковой грамматике, но это должно иметь смысл в любом случае.к югу >