До или после увеличения магическим образом не откладывают вещи на потом. Это просто встроенная стенография.
![enter image description here](https://i.stack.imgur.com/1Y4q9.png)
// pre-increment
$var = 5;
print(++$var); // increments first, then passes value (now 6) to print()
// post-increment
$var = 5;
print($var++); // passes value (still 5) to print(), then increments
Теперь давайте посмотрим на цикл.
for ($i = 0; $i < 9; $i++) {
print($i);
}
Последняя часть объявления цикла ($i++
) - это просто инструкция, выполняемая после каждого цикла. Он «передает» значение в никуда, а затем увеличивает его. $i
нигде не используется в то время. Позже, когда выполняется следующий оператор (print($i);
), значение $i
уже увеличилось.
// add 1, then do nothing with $i
for ($i = 0; $i < 9; ++$i) {}
// do nothing with $i, then add 1
for ($i = 0; $i < 9; $i++) {}
В зависимости от того, как вы это сделаете, $i
будет одинаковым внутри цикла.
Если это поможет, вы можете думать о них как о маленьких подпрограммах, которые делают это:
// ++$i
{
$i = $i + 1;
return $i;
}
// $i++
{
return $i;
$i = $i + 1;
}
Когда я перечитываю ваш вопрос, я думаю, что больше путаницы в том, как работает цикл, чем в том, как работают операторы приращения. Помня о том, что приращение - это простая операция «все за один раз», вот как работает третье выражение в цикле.
// here's a basic loop
for ($i = 0; $i < 9; $i++) {
// do loop stuff
print($i);
}
// this is exactly what happens
for ($i = 0; $i < 9; ) {
// do loop stuff
print($i);
$i++;
}
То, что последняя строка может быть помещена в объявление цикла, не дает ему особых полномочий. Там нет никаких ссылок или что-либо используется за кулисами. Одна и та же переменная $i
видна как внутри, так и снаружи цикла. Каждый оператор внутри или вне цикла непосредственно ищет значение $i
, когда это необходимо. Вот и все. Не смешное дело.