1

В качестве примера в учебнике есть вот такой код:

milesTraveled = endingMileage -= startingMileage;
amountOwed = milesTraveled *= reimburseRate;

Почему вместо обычных операторов умножения и вычитания использованы *= и -=. Они чем-то отличаются?

Kromster
  • 13,809
  • 1
    milesTraveled = endingMileage -= startingMileage; преобразуется в milesTraveled = (endingMileage = endingMileage - startingMileage); и раскроем скобки endingMileage = endingMileage - startingMileage; milesTraveled = endingMileage; и всё. – nick_n_a Jul 25 '18 at 11:17
  • 1
    Выкиньте этот учебник в мусорку, такие примеры это тихий ужас. – ixSci Jul 25 '18 at 14:20
  • @ixSci взял эту книгу из этого вопроса как рекомендуемую... https://ru.stackoverflow.com/questions/416584/%d0%9a%d0%bd%d0%b8%d0%b3%d0%b8-%d0%b8-%d1%83%d1%87%d0%b5%d0%b1%d0%bd%d1%8b%d0%b5-%d1%80%d0%b5%d1%81%d1%83%d1%80%d1%81%d1%8b-%d0%bf%d0%be-c – Novitskiy Denis Jul 26 '18 at 05:16
  • А что это за книга, как называется? – ixSci Jul 26 '18 at 05:57
  • @ixSci Изучаем C#, Д. Грин, Э. Стиллмен – Novitskiy Denis Jul 26 '18 at 06:17
  • Лучше Троелсена читайте, а Head First это плохая серия, на мой взгляд. – ixSci Jul 26 '18 at 10:14
  • @ixSci спасибо. Почитал бы, но в электронной версии нет, а цена на бумажную версию слегка кусается:( – Novitskiy Denis Jul 26 '18 at 10:29

2 Answers2

2

Почему вместо обычных операторов умножения и вычитания использованы *= и -=.

Можете читать их буквально "умножить и провести присвоение" и "вычесть и провести присвоение". Т.е. после проведения указанных операций не только изменится значения переменных milesTraveled и amountOwed, но и переменной endingMileage.

Пример с указанными операциями:

let startingMileage;
let endingMileage;
let milesTraveled;
let amountOwed;
let reimburseRate;

startingMileage = 1; endingMileage = 3; reimburseRate = 10;

milesTraveled = endingMileage -= startingMileage; console.log("milesTraveled:" + milesTraveled ); amountOwed = milesTraveled *= reimburseRate;

console.log("startingMileage:" + startingMileage + ", endingMileage:" + endingMileage + ", milesTraveled:" + milesTraveled + ", amountOwed:" + amountOwed);

  • Но смысл такого действия от меня ускользает. Зачем нужно менять endingMileage? – Alexey Ten Jul 25 '18 at 11:06
  • то есть, если endingMileage=4 и startingMileage=1, то после этой операции milesTraveled=3 и endingMileage=3? – Novitskiy Denis Jul 25 '18 at 11:07
  • @AlexeyTen на вопрос "почему?" ответом, скорее всего, будет "это опечатка" – Regent Jul 25 '18 at 11:08
  • В общем надо смотреть в учебник. Может у этого есть глубокий смысл, хотя я тоже склоняюсь к опечатке. – Alexey Ten Jul 25 '18 at 11:09
  • @NovitskiyDenis да, будет 3 и 3. В этом, кстати, можно убедиться, запустив этот код самостоятельно – Regent Jul 25 '18 at 11:10
  • @NovitskiyDenis Добавил в ответ пример, обратите внимание на разные значения переменной с после первой операции и второй. –  Jul 25 '18 at 11:11
  • @Anamnian спасибо! – Novitskiy Denis Jul 25 '18 at 11:12
  • @Anamnian зачем вы разбили объявление и инициализацию переменных (аж 5 штук) на две строки? Код увеличился на 6 строк на ровном месте. – Regent Jul 25 '18 at 11:13
  • Вы не показали раскрытие скобок и операторов. А это главная "тонкость", которая непонятна в вашем ответе. – nick_n_a Jul 25 '18 at 11:19
  • @Regent Люблю код читать сверху-вниз, а не сверху-вниз и слева-направо. –  Jul 25 '18 at 11:31
  • @nick_n_a По-моему мнению я словами достаточно объяснил как раскрываются данные операторы. –  Jul 25 '18 at 11:31
  • @Anamnian что вы подразумеваете под "слева-направо"? То есть startingMileage = 1; - это не "слева-направо", а let startingMileage = 1; - "слева-направо"? – Regent Jul 25 '18 at 11:34
  • @Regent на ваш второй вопрос ответ да, так как в первом случае выполняется 1 операция, во втором 2. –  Jul 25 '18 at 11:42
2

Составные операторы "раскрываются" следующим образом:

milesTraveled = endingMileage -= startingMileage;

преобразуется в

milesTraveled = (endingMileage = endingMileage - startingMileage);

и раскроем скобки

endingMileage = endingMileage - startingMileage; 
milesTraveled = endingMileage;
milesTraveled = milesTraveled * reimburseRate;
amountOwed = milesTraveled;

Cмысл - более краткая запись.

Regent
  • 19,134
nick_n_a
  • 8,057