Size: a a a

JavaScript.Ninja

2020 February 24

A

Alexander in JavaScript.Ninja
Виктор Притулюк
i++ приоритет 17, ++i приоритет 16
Это я знаю. Я уже раз 50 там перечитывал.
Но какой логике поддается ассоциативность все еще не понял

 3   16  13   17 14  16
i =   ++i  +  i++  *  ++i
источник

SK

Sergey Kostyrko in JavaScript.Ninja
ассоциативность  это о операторах с одинаковым приоритетом а здесь приоритет разный
источник

ВП

Виктор Притулюк in JavaScript.Ninja
следует понимать что ++i и i++ являются всего лишь упрощением кода. если сложно понять как они вписываются в очередность вычислений в таком виде то всего 1 раз распишите подробно и станет понятно
источник

A

Alexander in JavaScript.Ninja
Sergey Kostyrko
ассоциативность  это о операторах с одинаковым приоритетом а здесь приоритет разный
Если так, то по правилу приоритетности операторов, (Операторы с более высоким приоритетом становятся операндами операторов с более низким приоритетом)

 3   16  13   17 14  16
i =   ++i  +  i++  *  ++i

(17) i++ //инкрементирует на 1, но вернет 0
(16) ++i //инкрементирует на 1 и вернет 2
(14) 0 * 2
(16) ++i //инкрементирует на 1 и вернет 3
(13) 3 + 0 * 2
( 3) i = 3

Так должна слаживаться очередность?
Но результат не верный. Браузер выдает в качестве результата i = 4
источник

VO

Vladimir Olegovich in JavaScript.Ninja
источник

VO

Vladimir Olegovich in JavaScript.Ninja
Сначала выполняется умножение, с инкриментом, после умножения происходит еще один инкримент, и только потом прибавление с инкрементом первого значения
источник

VO

Vladimir Olegovich in JavaScript.Ninja
i++ имеет больший приоритет, чем сложение
источник

ВП

Виктор Притулюк in JavaScript.Ninja
Alexander
Если так, то по правилу приоритетности операторов, (Операторы с более высоким приоритетом становятся операндами операторов с более низким приоритетом)

 3   16  13   17 14  16
i =   ++i  +  i++  *  ++i

(17) i++ //инкрементирует на 1, но вернет 0
(16) ++i //инкрементирует на 1 и вернет 2
(14) 0 * 2
(16) ++i //инкрементирует на 1 и вернет 3
(13) 3 + 0 * 2
( 3) i = 3

Так должна слаживаться очередность?
Но результат не верный. Браузер выдает в качестве результата i = 4
читайте выражение как текст в книге: берем 1, т.е. изначальное i увеличенное на 1, и складываем с произведением 1, с увеличением на 1, на 3, т.е. предыдущее i еще раз увеличенное на 1.
итератор не распределяет значения i++ и ++i заранее, он расставляет их по мере того как встречает их на пути.
источник

ВП

Виктор Притулюк in JavaScript.Ninja
Vladimir Olegovich
i++ имеет больший приоритет, чем сложение
если рассматривать вариант что i++ выполнится 1-м то получим i= 3 + (0 * 2). по такой логике i= ++i  +  i++  * i++ выдаст тот же результат, по факту же он другой
источник

VO

Vladimir Olegovich in JavaScript.Ninja
а изначально i === 0 или 1?
источник

A

Alexander in JavaScript.Ninja
Vladimir Olegovich
а изначально i === 0 или 1?
i = 0
источник

ВП

Виктор Притулюк in JavaScript.Ninja
в условии i = 0
источник

VO

Vladimir Olegovich in JavaScript.Ninja
У тебя 0 не будет, потому что при умножении у тебя i уже увеличилась на еденицу в ++1
источник

VO

Vladimir Olegovich in JavaScript.Ninja
получается (i++ * ++i) === (1 + 1)
источник

VO

Vladimir Olegovich in JavaScript.Ninja
второй инкремент преоритетней умножения
источник

TC

TeeGeRoN Corp in JavaScript.Ninja
Vladimir Olegovich
получается (i++ * ++i) === (1 + 1)
А не 3?
источник

ВП

Виктор Притулюк in JavaScript.Ninja
Vladimir Olegovich
получается (i++ * ++i) === (1 + 1)
let i = 0;
i = ++i + i++ * i++; //Результат: 3

i = 0; //Обновляем данные
i = ++i + i++ * ++i; //Результат: 4
источник

A

Alexander in JavaScript.Ninja
Ответ я знаю, меня интересует сама логика очередности
источник

IK

Illya Klymov in JavaScript.Ninja
Да засуньте вы это уже в ast explorer
источник

IK

Illya Klymov in JavaScript.Ninja
И посмотрите как дерево выглядит
источник