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

laimas 14.09.2018 12:21

Цитата:

Сообщение от AlexanderFilatov
Далее происходит вычисление выражения: (a = b), в переменную "a"

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

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

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

x = 2
y = 3

x * (y + 18)

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

2 * (3 + 18)

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

AlexanderFilatov 14.09.2018 13:00

Цитата:

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

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

И вот на этом примере я "завис"!Теперь все понял!Спасибо.

ksa 14.09.2018 13:04

Цитата:

Сообщение от AlexanderFilatov
Здесь это понятно, что бессмысленно!

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

Это все нидзя стайл.

AlexanderFilatov 14.09.2018 13:07

Цитата:

Сообщение от ksa
Зачем тогда это применять на деле?

Хотелось разобраться в сути!

ksa 14.09.2018 13:19

Цитата:

Сообщение от AlexanderFilatov
Хотелось разобраться в сути!

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

Мое мнение - не стоит так поступать.

laimas 14.09.2018 13:20

Цитата:

Сообщение от 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. Кстати, кроме приоритета операторы обладают еще и ассоциативностью.

AlexanderFilatov 17.09.2018 09:33

Ваш пример понятен.В режиме call stack chrome все значения переменных на каждом этапе цикла показывает!Про приоритеты и ассоциативность понятно.Поправьте меня если я не прав!Вообщем сначала интерпретатор проводит построчный анализ кода!(слева на право)А потом в соответствии с приоритетами и ассоциативностью вычисляет выражение.Вроде так!
Например здесь он сначала вычисляет значение в скобках, а потом использует новое значение переменной "a" при операции делении:
var b = 10, a = 5;
a = (a = b) / a;
alert(a); // 1

AlexanderFilatov 17.09.2018 10:49

Цитата:

Сообщение от 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));

Спасибо всем за ответы и советы!:)

laimas 17.09.2018 14:37

Цитата:

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

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

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

x * (y + 18),

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

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

Dilettante_Pro 17.09.2018 14:48

laimas,
тогда почему
var b = 10, a = 5;
a = (a = b) / a;
alert(a); // 1

и
var b = 10, a = 5;
a = (a = b) / b;
alert(a); // 1

a
var b = 10, a = 5;
a = a  / b;
alert(a); // 0.5


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