Прединкрементное и постинкрементное - PullRequest
5 голосов
/ 19 июня 2011

Чем они отличаются? Вот что я думаю, но я не уверен ....

Если вы используете предварительное увеличение, например, в цикле for с ++ j, то вы в основном говорите: «Сделайте копию значения j для использования в цикле, затем увеличьте j, затем пройдите через операторы в цикле с копией j. " Если вы используете постинкремент в том же цикле j ++, то вы в основном говорите: «Сделайте копию значения j для использования в цикле, затем выполните инструкции в цикле с копией j, затем увеличьте J «.

Причина, по которой я не уверен, заключается в том, что я создал цикл for, который умножает значение j на 10, а затем выводит результат для j = 1 - j = 12, используя как пост-, так и предварительное увеличение. Читаемый человеком результат точно такой же, как и после, и до приращения. Я думаю: «Как выходные данные точно такие же, если не используется какая-либо операция копирования?»

Итак, я предполагаю, что разница между до и после приращения действительно становится важной, в php, когда я использую ссылки (которые действуют как указатели в php), а не имена для возвращаемых значений? Это может произойти из-за того, что копии ссылок не сделаны, поэтому предварительное увеличение будет следующим: «Увеличьте j, затем пройдитесь по операторам в цикле с измененным значением j, затем снова увеличьте j ...», тогда как после Инкремент будет выглядеть следующим образом: «Используйте значение j для операторов в цикле, затем измените значение j, затем выполните цикл с новым значением j ...»

Ответы [ 3 ]

23 голосов
/ 19 июня 2011

До или после увеличения магическим образом не откладывают вещи на потом. Это просто встроенная стенография.

enter image description here

// 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, когда это необходимо. Вот и все. Не смешное дело.

1 голос
/ 19 июня 2011

Выполняя $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 в соответствии с примерами выше.В этом случае вам нужно выбрать именно то, что вы хотите сделать.

0 голосов
/ 29 января 2016
$i = 0;
echo $i++;
echo $i;
$j=0;
echo ++$j;
echo $j;

Предварительно инкрементное отображение увеличенного значения. Но после увеличения отображаемое значение затем увеличивается. О коде будет выводить 01 и 11

...