Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.09.2018, 08:57
Интересующийся
Отправить личное сообщение для AlexanderFilatov Посмотреть профиль Найти все сообщения от AlexanderFilatov
 
Регистрация: 14.09.2018
Сообщений: 26

Приоритеты в выражении запутали
Здравствуйте!Помогите понять, почему переменная 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
Ответить с цитированием
  #2 (permalink)  
Старый 14.09.2018, 09:10
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

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

// итого 15 % 10 = 5
alert(c); // 5
Ответить с цитированием
  #3 (permalink)  
Старый 14.09.2018, 09:29
Интересующийся
Отправить личное сообщение для AlexanderFilatov Посмотреть профиль Найти все сообщения от AlexanderFilatov
 
Регистрация: 14.09.2018
Сообщений: 26

Это я понял!Но ведь переменная a ссылается на одну область памяти и если у нее поменялось значение в одно месте, то и в другом должно поменяться!Почему так?
Ответить с цитированием
  #4 (permalink)  
Старый 14.09.2018, 09:42
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 278

AlexanderFilatov,
Так первую "а" ты еще не успел поменять. Это в математика сначала скобки выполняются, а присваивание переменных это не математика. Все идет с лева на право, код у тебя читается так 15 % (10).
Ответить с цитированием
  #5 (permalink)  
Старый 14.09.2018, 10:00
Интересующийся
Отправить личное сообщение для AlexanderFilatov Посмотреть профиль Найти все сообщения от AlexanderFilatov
 
Регистрация: 14.09.2018
Сообщений: 26

Все сообразил!Я понял в чем ошибка моих размышлений!Я думал математически и забыл что интерпретатор вычисляет выражение слева направо!Большое спасибо за ответ!
Ответить с цитированием
  #6 (permalink)  
Старый 14.09.2018, 10:08
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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

Последний раз редактировалось laimas, 14.09.2018 в 10:18.
Ответить с цитированием
  #7 (permalink)  
Старый 14.09.2018, 10:28
Интересующийся
Отправить личное сообщение для AlexanderFilatov Посмотреть профиль Найти все сообщения от AlexanderFilatov
 
Регистрация: 14.09.2018
Сообщений: 26

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

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

Я правильно вас понял!?
Ответить с цитированием
  #8 (permalink)  
Старый 14.09.2018, 10:47
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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

то порядок выполнения всего выражения будет с 3 к 1, а никак ни слева направо.
Ответить с цитированием
  #9 (permalink)  
Старый 14.09.2018, 11:33
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от AlexanderFilatov
Это я понял!Но ведь ...
Значит не до конца понял...
Ответить с цитированием
  #10 (permalink)  
Старый 14.09.2018, 12:06
Интересующийся
Отправить личное сообщение для AlexanderFilatov Посмотреть профиль Найти все сообщения от AlexanderFilatov
 
Регистрация: 14.09.2018
Сообщений: 26

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

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

Последний раз редактировалось AlexanderFilatov, 14.09.2018 в 12:08.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сформировать массив в выражении imedia Элементы интерфейса 0 12.06.2015 15:57
Экранирование спецсимволов в строковом регулярном выражении riva Общие вопросы Javascript 2 26.09.2014 15:46
Помощь в регулярном выражении! celkabelka Общие вопросы Javascript 5 13.04.2013 17:53
Раскрытие скобок в выражении Aion Общие вопросы Javascript 6 02.01.2013 19:41
Изменить знак в выражении или скрипт плавного изменения размеров Fenjmen51 Общие вопросы Javascript 4 29.05.2012 18:47