Учитывая следующий код:
int a=0,b=1;
int r=a+++b;
какие операции выполняются и в каком порядке?
a++ + b
a + ++b
Я этот компилятор специфичен или зависит от стандарта?
Это (a++) + b
но не из-за приоритета оператора.
Он анализируется как (a++) + b
потому что компилятор принимает самый длинный токен, который он может использовать из последовательности символов. Другими словами, лексер продолжает читать символы, пока не встретит что-то, что не может быть частью того же токена, что и у него.
Это также то, как он интерпретирует >=
как один токен вместо >
и =
и double
как "double", а не " do
uble".
Существуют правила приоритетности операторов для таких операторов, как
a || b && c
// "a || (b && c)" NOT "(a || b) && c", because && takes precedence
Однако в вашем случае операторы ++ и + уже определены. Как только операторы будут определены, могут применяться правила приоритета операторов.
Есть несколько хороших ответов на вопрос: почему a++ +++ b не работает в C? что должно объяснить это более подробно.
It is parsed as a ++ + b because ...
Там нет (
или )
в оригинале, поэтому вы не хотите добавлять их в данный момент. Вы можете (и должны) использовать при объяснении, как оценивается выражение (первое предложение). Примечание: компилятор не всегда берет самый длинный токен (помните всю проблему вокруг >>
с шаблонами).
>>
в шаблонах, то причина в том, что это проблема, из-за взятия самого длинного маркер: лексер получает >>
когда должно быть два >
с.
Это определяется приоритетом оператора. Так как postfix ++ имеет более высокий приоритет, чем оператор +, он связывает более строгие с a, а post добавляется в b, поэтому результат:
(a++) + b