Для чего нужен оператор декремента (—) в PHP?

Ответ

Оператор декремента (--) уменьшает значение числовой переменной на единицу. Это базовая, но важная операция для управления счетчиками и итерациями.

Существует две формы, которые отличаются моментом возврата значения:

  1. Постфиксный декремент ($a--): Сначала возвращает текущее значение переменной, а затем уменьшает его.
  2. Префиксный декремент (--$a): Сначала уменьшает значение переменной, а затем возвращает новое значение.

Пример, демонстрирующий разницу:

// Постфиксный декремент
$counter = 5;
$result = $counter--; // Шаг 1: $result присваивается 5. Шаг 2: $counter становится 4.
echo 'Результат: ' . $result . ', Счетчик: ' . $counter; // Результат: 5, Счетчик: 4

// Префиксный декремент
$counter = 5;
$result = --$counter; // Шаг 1: $counter становится 4. Шаг 2: $result присваивается 4.
echo 'Результат: ' . $result . ', Счетчик: ' . $counter; // Результат: 4, Счетчик: 4

Практическое применение в циклах: Чаще всего декремент используется для организации обратного отсчета.


// Обратный цикл for
for ($i = 10; $i > 0; $i--) {
    echo $i . '... ';
}
// Вывод: 10... 9... 8... ... 1...

// Цикл while с декрементом
$attempts = 3;
while (--$attempts > 0) { // Уменьшаем ПЕРЕД проверкой
    echo "Попытка #$attemptsn";
}
// Вывод: Попытка #2nПопытка #1n```
**Ключевой момент:** Выбор между префиксной и постфиксной формой критичен, когда значение оператора используется в выражении. Если результат не используется, а важен только факт уменьшения (как в `for ($i=10; $i>0; $i--)`), разницы нет.

Ответ 18+ 🔞

Слушай, давай разберём эту простыню про оператор --. Всё проще, чем кажется, если не забивать голову заумными формулировками. Это просто минус один, ёпта.

Вот представь: у тебя есть переменная — условно, бутылка пива. Оператор -- — это ты отпиваешь из неё один глоток. Всё. Но тут есть хитрая жопа: момент, когда ты отдаёшь эту бутылку другу. Отдаёшь полную или уже отпитую? Вот и вся разница между $a-- и --$a.

Две формы, а по факту — один хрен:

  1. Постфиксный ($a--): "Сначала отдай, потом отпей". Ты говоришь: "На, держи бутылку" (возвращаешь текущее значение), а потом уже делаешь глоток (уменьшаешь на 1). Друг получает полную.

  2. Префиксный (--$a): "Сначала отпей, потом отдай". Ты сначала хлебаешь глоток, а потом суёшь бутылку другу в руки. Ему достаётся уже неполная.

Пример, чтобы вообще всё стало ясно, как божий день:

// Вариант "Сначала отдай, потом отпей" ($a--)
$bottle = 5; // Полная бутылка, 5 глотков.
$friendGets = $bottle--; // ДРУГ ПОЛУЧАЕТ ЦИФРУ 5. А в бутылке теперь 4 глотка.
echo 'Другу отдал: ' . $friendGets . ', Осталось в бутылке: ' . $bottle; // Другу отдал: 5, Осталось в бутылке: 4

// Вариант "Сначала отпей, потом отдай" (--$a)
$bottle = 5; // Снова налили.
$friendGets = --$bottle; // ТЫ СНАЧАЛА отпиваешь (остаётся 4), ПОТОМ отдаёшь другу цифру 4.
echo 'Другу отдал: ' . $friendGets . ', Осталось в бутылке: ' . $bottle; // Другу отдал: 4, Осталось в бутылке: 4

Где это нужно, спросишь? Да похуй, спроси! Чаще всего — в циклах, когда надо идти в обратную сторону, как будто на дворе 2002-й год и идёт обратный отсчёт до взрыва в какой-нибудь игрушке.

// Классический обратный отсчёт
for ($i = 10; $i > 0; $i--) { // Тут без разницы, префикс или постфикс, потому что значение в воздух кидаем.
    echo $i . '... ';
}
// Выведет: 10... 9... 8... ... 1... Бум!

// А вот тут уже важно! Цикл while с уменьшением ПЕРЕД проверкой.
$attempts = 3; // Попытки ввода пароля, например.
while (--$attempts > 0) { // СНАЧАЛА отпили глоток (3 -> 2), ПОТОМ проверь, больше ли нуля.
    echo "Попытка #$attemptsn"; // Выведет с #2 и #1. С третьей уже не пустит.
}

Ключевой момент, блядь: Париться надо только тогда, когда ты это уменьшенное значение сразу куда-то подставляешь или присваиваешь. Если ты просто в цикле for пишешь $i--, то да похуй — это просто "отпил глоток и пошёл дальше". А вот если на этом строится логика, как в while (--$attempts > 0), то тут уже надо думать, э бошка думай, когда отпивать: до проверки или после. Иначе будет вам хиросима и нигерсраки с логикой программы.