Если написать вот такой код в
JavaScript:
let i = 1;
console.log( --i + i++ ); // 0
Результат будет
0.
Почему?
Если посмотреть на
таблицу приоритетов операторов, то видно что самым высоким приоритетом тут обладает постфиксный инкремент (i++) и в соответствии с этим должен выполнится первым, далее префиксный декремент (--i) и сложение. В результате чего мы должны получить не 0, а 2 в качестве результата.
По ссылке выше так же описана ассоциативность, которая как там описано определяет порядок выполнения операторов с одинаковым приоритетом, но у нас все операторы имеют разный приоритет.
Если код выше написать на
C++:
int i = 1;
cout << --i + i++; // 1
То в качестве результата мы получим
1 (для C++ использовался онлайн компилятор:
ссылка).
Так же можно попробовать заменить постфиксный инкремент на вызов (какой-либо) функции - вызов функции так же будет выполняться после префиксного декремента (хотя функция имеет приоритет более высокий):
"use strict"
function f(x) {
console.log(x); // Результат: 0. А значит вызов функции произошел после декремента
return x;
}
let i = 1;
console.log( --i + f(i) ); // Результат: 0.
UPD: Этим вопросом я хочу узнать от чего зависит порядок вычисления выражений, ведь по данным примерам видно, что операторы имеющие приоритет более высокий необязательно вычисляются раньше (это особенно видно из последнего примера с функцией).