Перейти к содержимому
Теория · Операторы и сравнение · урок 3 из 8

Инкремент и составное присваивание

В прошлом уроке операторы считали новое значение, а переменные оставались прежними. Часто нужно другое: изменить саму переменную — прибавить к счёту, дописать к строке.

У многих калькуляторов есть память и кнопка M+. Она прибавляет число с экрана к тому, что уже лежит в памяти, и старое значение не нужно набирать заново. В PHP эту работу делают операторы, которые меняют переменную на месте.

Без них имя переменной приходится писать дважды:

PHP
<?php

$total = 10;
$total = $total + 5;
$total += 5;
$total *= 2;
echo $total, "\n"; // 40

Разберём по строкам:

  1. $total = 10 кладёт в $total число 10.
  2. $total = $total + 5 читает старое значение, прибавляет 5 и записывает 15 обратно.
  3. $total += 5 делает то же самое короче: теперь в $total лежит 20.
  4. $total *= 2 умножает на два, и программа печатает 40.

Составное присваивание

Запись $total += 5 называют составным присваиванием: оператор и знак = слиты в один. Такая запись есть у каждого арифметического оператора:

  • += прибавляет: $n += 2 — это $n = $n + 2;
  • -= вычитает;
  • *= умножает;
  • /= делит;
  • %= оставляет остаток;
  • **= возводит в степень: после $c = 3; $c **= 2; в $c лежит 9.

Тип результата подчиняется тем же правилам, что и у обычной арифметики. После $n = 10; $n /= 4; в $n лежит float(2.5), потому что 10 на 4 нацело не делится.

Оператор .= для строк

Оператор .= приклеивает строку справа к той, что уже лежит в переменной. Так строку собирают по кусочкам:

PHP
$line = 'PHP';
$line .= ' ';
$line .= 8;
echo $line, "\n"; // PHP 8

Перед склейкой число 8 превращается в строку '8', поэтому в $line получается PHP 8. Здесь кнопка M+ перестаёт быть точной картинкой: калькулятор умеет только прибавлять числа, а .= дописывает текст.

Инкремент и декремент

Прибавлять единицу приходится так часто, что для этого есть отдельный оператор. $i++ увеличивает $i на один — это инкремент. $i-- уменьшает на один — это декремент.

У каждого из них две формы. Разница видна, когда результат сразу записывают в другую переменную или печатают.

$i++: сначала старое значение

Представьте автомат с талонами в очереди. Он выдаёт вам номер, который горит на табло, и сразу переключает табло на следующий. У вас в руке старый номер, а на табло уже новый.

Так работает $a = $i++: в $a попадает старое значение $i, а сама $i после строки уже на единицу больше.

++$i: сначала прибавить

Форма ++$i делает наоборот: сначала переключает табло, а потом выдаёт номер с него. В $b = ++$i переменная $i сначала увеличивается, и в $b попадает уже новое значение.

Нажимайте «Следующий шаг» и на каждом шаге сравнивайте два числа: что получила $a или $b и что лежит в $i после строки.

ВживуюСтарое и новое значениешаг 1 из 7 · рамок: 1

Переменная $i получает значение 1.

Сравнивайте, что получили $a и $b и что лежит в $i

Обе формы меняют переменную одинаково: после $i++ и после ++$i в $i на единицу больше. Различается только значение, которое отдаёт само выражение: у $i++ старое, у ++$i новое.

Здесь автомат с талонами — неточная картинка: его табло только растёт, а $i-- и --$i уменьшают переменную по тем же правилам.

Чем $i++ отличается от ++$i, часто спрашивают на собеседовании. Ответ складывается из трёх фактов этого урока:

  • оба оператора увеличивают $i на единицу;
  • $i++ возвращает значение до увеличения;
  • ++$i возвращает значение после увеличения.

Частая ошибка

Счётчик увеличивают и тут же записывают результат обратно:

PHP
$count = 5;
$count = $count++; // ✗
echo $count, "\n"; // 5

Вы ждали 6, а PHP печатает 5. $count++ отдаёт старое значение 5 и увеличивает $count до 6, но затем = записывает в $count отданную пятёрку. Сообщения об ошибке нет. Чтобы увеличить переменную, хватит одной строки $count++; без присваивания.

Главное

  • $total += 5 — короткая запись $total = $total + 5; так же работают -=, *=, /=, %= и **=.
  • .= приклеивает строку справа к значению переменной.
  • $i++ отдаёт старое значение, а ++$i — новое; переменная увеличивается в обоих случаях.
  • $i = $i++ оставляет $i прежней: присваивание записывает старое значение.