Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 14.09.2018, 12:06
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

AlexanderFilatov,
порядок выполнения выражения зависит от приоритета операторов
Ответить с цитированием
  #12 (permalink)  
Старый 14.09.2018, 12:21
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от AlexanderFilatov
Далее происходит вычисление выражения: (a = b), в переменную "a"
Здесь a = b просто бессмысленное действие, равноценно как проще (b), а так как и скобки тут не нужны, то все ваше действие упрощается до a % b. В левой части будет 15, а что там вы далее творите, может иметь значение, но не в данном случае.

А вот "Результат 5 запишется снова в переменную "a", это да и это конечное значение.

Ну это равноценно как написать в тетрадке в клеточку:

x = 2
y = 3

x * (y + 18)

Анализируем, получаем выражение:

2 * (3 + 18)

далее по правилам арифметики вычисляем то, что в скобках, а приравниваете ли вы результат этого вычисления чему либо в уме или нет, это не имеет для выражения никакого значения.

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

Сообщение от laimas
Здесь a = b просто бессмысленное действие, равноценно как проще (b), а так как и скобки тут не нужны, то все ваше действие упрощается до a % b. В левой части будет 15, а что там вы далее творите, может иметь значение, но не в данном случае.
Здесь это понятно, что бессмысленно!Просто я разбирал одну из реализаций алгоритма Евклида:
function nod(a, b) {
        while (b !== 0) {
           b = a % (a = b);
        } 
        return a;
    }
alert(nod(21, 14));

И вот на этом примере я "завис"!Теперь все понял!Спасибо.
Ответить с цитированием
  #14 (permalink)  
Старый 14.09.2018, 13:04
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от AlexanderFilatov
Здесь это понятно, что бессмысленно!
Зачем тогда это применять на деле?
Дабы потом очередной бедняга не понимал откуда берется та пятерка?

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

Сообщение от ksa
Зачем тогда это применять на деле?
Хотелось разобраться в сути!
Ответить с цитированием
  #16 (permalink)  
Старый 14.09.2018, 13:19
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от AlexanderFilatov
Хотелось разобраться в сути!
Есть прогеры, которые специально используют особенности ЯП дабы специально и максимально запутать код программы.
В том случае просто сэкономили на одной переменной и видал какой резонанс.

Мое мнение - не стоит так поступать.
Ответить с цитированием
  #17 (permalink)  
Старый 14.09.2018, 13:20
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от AlexanderFilatov
И вот на этом примере я "завис"!
Ну так ваш код с кодом этой функции нельзя сравнивать, вы просто воткнули увиденное себе без всякой пользы. А в функции присвоение переменной a значения переменной b используется в следующих итерациях, а также является возвращаемым значением. Просто выведите в консоль:

function nod(a, b) {
    while (b !== 0) {
        console.log('before '+a);
        b = a % (a = b);
        console.log('after '+a);
    }
    console.log('return '+a);
    return a;
}
nod(21, 14);


PS. Кстати, кроме приоритета операторы обладают еще и ассоциативностью.

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

Ваш пример понятен.В режиме call stack chrome все значения переменных на каждом этапе цикла показывает!Про приоритеты и ассоциативность понятно.Поправьте меня если я не прав!Вообщем сначала интерпретатор проводит построчный анализ кода!(слева на право)А потом в соответствии с приоритетами и ассоциативностью вычисляет выражение.Вроде так!
Например здесь он сначала вычисляет значение в скобках, а потом использует новое значение переменной "a" при операции делении:
var b = 10, a = 5;
a = (a = b) / a;
alert(a); // 1
Ответить с цитированием
  #19 (permalink)  
Старый 17.09.2018, 10:49
Интересующийся
Отправить личное сообщение для AlexanderFilatov Посмотреть профиль Найти все сообщения от AlexanderFilatov
 
Регистрация: 14.09.2018
Сообщений: 26

Сообщение от ksa
Есть прогеры, которые специально используют особенности ЯП дабы специально и максимально запутать код программы.
В том случае просто сэкономили на одной переменной и видал какой резонанс.

Мое мнение - не стоит так поступать.
Вообщем я вас услышал!Решение задачи должно быть как можно более понятней.Решил по другому:
function nod(a, b) {
  while (a != 0 && b != 0) {
        if (a > b) {
            a = a % b;
        } else {
            b = b % a;
        }
    }
    return a + b;  
}
alert(nod(30, 18));

Спасибо всем за ответы и советы!
Ответить с цитированием
  #20 (permalink)  
Старый 17.09.2018, 14:37
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

Выше же написано, что в функции новое значение переменной а будет использоваться на следующей итерации. При этом в самом выражении до вычисления вместо переменных будут взяты их текущие (!) значения. Еще выше было же:

x * (y + 18),

вспоминайте школу.

В вашем же выражении новое значение а получаемой ею в скобках нигде не используется, это действие у вас просто бессмыслица.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сформировать массив в выражении 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