| 
	| 
	
	| 
		
	| 
			
			 
			
				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,298
					 
		
 |  |  
	| 
	
 
	| Сообщение от AlexanderFilatov |  
	| Здесь это понятно, что бессмысленно! |  
	
 Зачем тогда это применять на деле? 
Дабы потом очередной бедняга не понимал откуда берется та пятерка?
 
Это все нидзя стайл. |  |  
	| 
		
	| 
			
			 
			
				14.09.2018, 13:07
			
			
			
		 |  
	| 
		
			
			| Интересующийся       |  | 
					Регистрация: 14.09.2018 
						Сообщений: 26
					 
		
 |  |  
	| 
	
 
	| Сообщение от ksa |  
	| Зачем тогда это применять на деле? |  
	
 Хотелось разобраться в сути! |  |  
	| 
		
	| 
			
			 
			
				14.09.2018, 13:19
			
			
			
		 |  
	| 
		
			|  | CacheVar       |  | 
					Регистрация: 19.08.2010 
						Сообщений: 14,298
					 
		
 |  |  
	| 
	
 
	| Сообщение от 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
 |  |  |  |