Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Приоритеты в выражении запутали (https://javascript.ru/forum/misc/75218-prioritety-v-vyrazhenii-zaputali.html)

AlexanderFilatov 14.09.2018 08:57

Приоритеты в выражении запутали
 
Здравствуйте!Помогите понять, почему переменная c = 5?
Ведь сначала вычисляется выражение в скобках: (a = b), т.е. переменная a меняет свое
значение на 10.А после происходит взятие остатка: 15 % 10 = 5.Только я вот чего не могу уяснить, почему переменная a в левой части выражении равняется 15, а не 10!?Значение переменной a должно было изменится, после операции в скобках или видимо тут используется старое значение переменной a.Подскажите пожалуйста в чем ошибка в моих рассуждениях!И как вычисляется по приоритетам данное выражение!Заранее спасибо!
var a = 15, b = 10, c;
c = a % (a = b);
alert(c); // 5

Artur_Hopf 14.09.2018 09:10

AlexanderFilatov,
вот что у тебя происходит:
var a = 15, b = 10, c;
c = a /* "а" у тебя тут равно 15*/ % (a/* только тут у тебя "а" становится 10*/ = b);

// итого 15 % 10 = 5
alert(c); // 5

AlexanderFilatov 14.09.2018 09:29

Это я понял!Но ведь переменная a ссылается на одну область памяти и если у нее поменялось значение в одно месте, то и в другом должно поменяться!Почему так?

Artur_Hopf 14.09.2018 09:42

AlexanderFilatov,
Так первую "а" ты еще не успел поменять. Это в математика сначала скобки выполняются, а присваивание переменных это не математика. Все идет с лева на право, код у тебя читается так 15 % (10).

AlexanderFilatov 14.09.2018 10:00

Все сообразил!Я понял в чем ошибка моих размышлений!Я думал математически и забыл что интерпретатор вычисляет выражение слева направо!Большое спасибо за ответ!

laimas 14.09.2018 10:08

Цитата:

Сообщение от AlexanderFilatov
интерпретатор вычисляет выражение слева направо

Он руководствуется вложениями, скобками и приоритетами, просто он берет присвоенное значение переменной при расчетах. Можно было бы и без переменной "с", присвоив результат расчета "a".

А сначала он не считает, а производит лексический анализ написанного выражения, и только потом принимает решение о действиях.

AlexanderFilatov 14.09.2018 10:28

Цитата:

Сообщение от laimas
Он руководствуется вложениями

Что вы понимаете под вложениями?

Получается он подставляет сначала значение 15, а затем значение 10 вычислив выражение (a = b) и присваивает той же переменной вот так:
var a = 15, b = 10;
a = a % (a = b);
alert(a); // 5

Я правильно вас понял!?

laimas 14.09.2018 10:47

Цитата:

Сообщение от AlexanderFilatov
Что вы понимаете под вложениями?

Язык программирования не только же для расчетов дважды два, в нем могут быть сложные выражения. Интерпретатор разбирая в общем то простой текст, анализирует, что требуется выполнить. А выполнение выражения будет зависеть от приоритетов операций, скобок. выражение может содержать и вложенные действия. Если к примеру нужно выполнить функцию b, один из аргументов которой задан как выполнение функции a, то сначала будет выполнена функция а, и только потом функция b. То есть если схематично представить так:

выражение 1(выражение 2(выражение 3))

то порядок выполнения всего выражения будет с 3 к 1, а никак ни слева направо.

ksa 14.09.2018 11:33

Цитата:

Сообщение от AlexanderFilatov
Это я понял!Но ведь ...

Значит не до конца понял... :(

AlexanderFilatov 14.09.2018 12:06

Цитата:

Сообщение от laimas
Если к примеру нужно выполнить функцию b, один из аргументов которой задан как выполнение функции a, то сначала будет выполнена функция а, и только потом функция b. То есть если схематично представить так:

выражение 1(выражение 2(выражение 3))

Значит порядок выполнения в данном конкретном примере такой:
1.В "a" подставляется значение 15
2.Далее происходит вычисление выражения: (a = b), в переменную "a" получит значение переменной "b".(присвоение)То есть 10.
3. 15 % (10)
4.Результат 5 запишется снова в переменную "a".
Я правильно понял суть?


Часовой пояс GMT +3, время: 17:53.