14.09.2018, 12:21
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от 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.
|
|
14.09.2018, 13:00
|
Интересующийся
|
|
Регистрация: 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.09.2018, 13:04
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,230
|
|
Сообщение от AlexanderFilatov
|
Здесь это понятно, что бессмысленно!
|
Зачем тогда это применять на деле?
Дабы потом очередной бедняга не понимал откуда берется та пятерка?
Это все нидзя стайл.
|
|
14.09.2018, 13:07
|
Интересующийся
|
|
Регистрация: 14.09.2018
Сообщений: 26
|
|
Сообщение от ksa
|
Зачем тогда это применять на деле?
|
Хотелось разобраться в сути!
|
|
14.09.2018, 13:19
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,230
|
|
Сообщение от AlexanderFilatov
|
Хотелось разобраться в сути!
|
Есть прогеры, которые специально используют особенности ЯП дабы специально и максимально запутать код программы.
В том случае просто сэкономили на одной переменной и видал какой резонанс.
Мое мнение - не стоит так поступать.
|
|
14.09.2018, 13:20
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от 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.
|
|
17.09.2018, 09:33
|
Интересующийся
|
|
Регистрация: 14.09.2018
Сообщений: 26
|
|
Ваш пример понятен.В режиме call stack chrome все значения переменных на каждом этапе цикла показывает!Про приоритеты и ассоциативность понятно.Поправьте меня если я не прав!Вообщем сначала интерпретатор проводит построчный анализ кода!(слева на право)А потом в соответствии с приоритетами и ассоциативностью вычисляет выражение.Вроде так!
Например здесь он сначала вычисляет значение в скобках, а потом использует новое значение переменной "a" при операции делении:
var b = 10, a = 5;
a = (a = b) / a;
alert(a); // 1
|
|
17.09.2018, 10:49
|
Интересующийся
|
|
Регистрация: 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));
Спасибо всем за ответы и советы!
|
|
17.09.2018, 14:37
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от AlexanderFilatov
|
Например здесь он сначала вычисляет значение в скобках, а потом использует новое значение переменной "a" при операции делении
|
Сделайте вывод в консоль текста выражения с подстановкой переменных, и вы поймете, что далеко не так будет.
Выше же написано, что в функции новое значение переменной а будет использоваться на следующей итерации. При этом в самом выражении до вычисления вместо переменных будут взяты их текущие (!) значения. Еще выше было же:
x * (y + 18),
вспоминайте школу.
В вашем же выражении новое значение а получаемой ею в скобках нигде не используется, это действие у вас просто бессмыслица.
|
|
17.09.2018, 14:48
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
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
|
|
|
|