В языке JavaScriptОператоры присваивания, почему результат -3?
var a=3;
a += a -= a*a; //-3
В языке C:
int a=3;
a += a -= a*a; //-12
В языке JavaScriptОператоры присваивания, почему результат -3?
var a=3;
a += a -= a*a; //-3
В языке C:
int a=3;
a += a -= a*a; //-12
В JS, операнды оператора, таких как +
, =
, *
или +=
всегда оцениваются слева направо. Так что здесь происходит, шаг за шагом:
var a = 3; // a = undefined
a += (a -= a*a); // a = 3
a = 3 + (a -= a*a); // a = 3
a = 3 + (a = 3 - a*a); // a = 3
a = 3 + (a = 3 - 3*a); // a = 3
a = 3 + (a = 3 - 3*3); // a = 3
a = 3 + (a = 3 - 9); // a = 3
a = 3 + (a = -6); // a = 3
a = 3 + -6; // a = -6
a = -3; // a = -6
-3; // a = -3
В отличие от этого, ваш код C делает оценить левую a
только после того, как правая операнд, в котором точка a
имеет значение -6
, который затем добавляется к себе. Однако язык C оставляет это как неопределенное поведение и не определяет конкретный порядок оценок, поэтому вы испытали это только как артефакт своего компилятора. Подробности см. В комментариях к Kay.
JavaScript назначения Траверс слева направо.
Вы говорите JS:
3 += 3 = 6
6 -= 3*3 = -3
Я не могу думать о перестановке этого, что привело бы к -12 ...
Это может иметь тот же результат, но не то, что здесь происходит. – Bergi
Btw, 'var a = 3; a - = a * a; a + = a' приводит к '-12' – Bergi
Touche - ваш ответ гораздо точнее описывает, что здесь происходит. Придется провести некоторое тестирование, чтобы убедиться. Я думаю, что на самом деле более точно сказать, что операторы присваивания в JS оцениваются справа налево, нет? –
В C результат не определен. В JS: https://es5.github.io/#x11.13.2 – kay
ваш оператор эквивалентен 'a = a + (a = a - a * a);' - это упрощает понимание –
... где внутреннее (правое) присваивание не имеет особого значения, потому что переменная сразу заменяется внешним (левым) назначением, поэтому это 'a = a + (a - (a * a))' – Bergi