Насколько они разные? Вот что я думаю, но я не уверен …
Если вы используете pre-incrementation, например, в цикле for с ++ j, то вы в основном говорите: «Сделайте копию значения j для использования в цикле, затем увеличьте j, а затем выполните инструкции в петля с копией j. " Если вы используете пост-инкрементирование в том же цикле j ++, вы в основном говорите: «Сделайте копию значения j для использования в цикле, а затем выполните инструкции в цикле с копией j, а затем увеличите J «.
Причина, по которой я не уверен, заключается в том, что я создал цикл for, который умножает значение j на 10, а затем выводит результат для j = 1 – j = 12, используя как post, так и pre-incrementation. Пользовательский читаемый вывод точно такой же, как и после и после инкремента. Я думаю: «Как выходы одинаковы, если нет какой-либо операции копирования?»
Итак, я предполагаю, что разница между pre- и post-incrementation действительно становится важной, в php, когда я использую ссылки (которые действуют как указатели в php), а не имена для возвращаемых значений? Это связано с тем, что копии ссылок не выполняются, поэтому предварительная инкрементация будет следующей: «Приращение j, затем выполните инструкции в цикле с измененным значением j, затем увеличивайте j снова …», инкремент будет выглядеть так: «Используйте значение j для операторов в цикле, затем измените значение j, затем перейдите в цикл с новым значением j …»
Pre- или post-incrementing не магически задерживают вещи до более позднего времени. Это просто встроенная стенография.
// 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
когда это необходимо. Вот и все. Нет смешного дела.
Когда вы выполняете $x++
, вы выполняете пост-инкремент … Это означает, что приращение произойдет только после того, как оператор был оценен.
Итак, учитывая следующий код:
$x = 10; $y = 0; $z = 5; $y = $z * $x++;
PHP делает это:
$x = 10; $y = 0; $z = 5; $y = $z * $x++; // Ignore Post-Increment, Evalutate $y = $z * $x; $y = 5 * 10; // Now Increment x - POST-INCREMENT $x = $x + 1; $x = 10 + 1; $x = 11; // Continue evaluating statement $y = 5 * 10; $y = 50;
Когда вы выполняете ++$x
, вы пре-инкрементируете … Это означает, что приращение произойдет до того, как будет вычисляться оператор:
$x = 10; $y = 0; $z = 5; $y = $z * ++$x; // Do Pre-Increment $x = $x + 1; $x = 10 + 1; $x = 11; // Evaluate $y = $z * $x; $y = 5 * 11; $y = 55;
В случае цикла for
в PHP PHP вычисляет цикл for следующим образом:
for($i = 0; $i < 30; $i++) { doSomething(); } // Is evaluated EXACTLY as such by PHP $i = 0; while($i < 30) { doSomething(); $i++; }
Первое выражение ( $i = 0
) оценивается (выполняется) безоговорочно в начале цикла.
В начале каждой итерации $i < 30
. Если он оценивает значение TRUE, цикл продолжается и выполняется вложенный оператор (ы). Если он вычисляет значение FALSE, выполнение цикла завершается.
В конце каждой итерации $i++
оценивается (выполняется) как независимое выражение.
Поэтому пост-инкрементирование или предварительное приращение переменной в качестве третьего выражения в цикле не влияет на его поведение. В этом простом случае оба выражения будут вести себя точно так же .
Однако в сложном цикле, таком как:
for($i = $j = 0; $i < 30; $i += ++$j) { $j = getResult($j); }
Пошаговое или предварительное приращение $j
напрямую влияет на значение $i
соответствии с приведенными выше примерами. В этом случае вам нужно выбрать именно то, что вы хотите сделать.
$i = 0; echo $i++; echo $i; $j=0; echo ++$j; echo $j;
Предварительный прирост отображает увеличенное значение. Но значение отображения приращения Post затем увеличивается. О коде будет выводиться 01 и 11