Какая разница между ++ $i и $i ++ в PHP?

В чем разница между ++$i и $i++ в PHP?

Ответ 1

++$i является предварительным приращением, тогда как $i++ пост-приращение.

  • pre-increment: прирастить переменную i сначала, а затем удалить ссылку.
  • post-increment: de-reference, а затем increment i

"Воспользуйтесь тем, что PHP позволяет вам выполнить пост-инкремент ($ я ++) и pre-increment (++ $i). Значение это то же самое, пока вы не записывая что-нибудь вроде $j = $i ++, однако pre-incrementing составляет почти 10% быстрее, что означает, что вы должны переключиться с пост-до предварительного приращения когда у вас есть такая возможность, особенно в узких петлях и особенно если вы педантичны микро-оптимизации!" - TuxRadar

Для дальнейшего уточнения пост-инкрементация в PHP была задокументирована как сохранение временной переменной, которая приписывает это 10% -ную накладную и пред-инкрементацию.

Ответ 2

++$i - предварительная инкрементация

  • $i увеличивается
  • возвращается новое значение

$i++ - это пост-инкремент

  • значение $i, скопированное во внутреннюю временную переменную
  • $i увеличивается
  • возвращается внутренняя копия старого значения $i

Ответ 3

++$i увеличивает $i, но оценивает значение $i+1 $i++ увеличивает $i, но оценивает старое значение $i.

Вот пример:

$i = 10;
$a = $i++;
// Now $a is 10, and $i is 11

$i = 10;
$a = ++$i;
// Now $a is 11, and $i is 11

Иногда для использования $i++ существует небольшая стоимость предварительной обработки. Смотрите, когда вы делаете что-то вроде

$a = $i++;

Вы действительно это делаете:

$temporary_variable = $i;
$i=$i+1;
$a=$temporary_variable;

Ответ 4

++$i //first increment $i then run line
$i++ //first run line then increment $i 

Ответ 5

в этом случае нет разницы:

for($i = 0;$i<3;++$i)var_dump $i;
/*
int(0)
int(1)
int(2)
*/
for($i = 0;$i<3;$i++)var_dump $i;
/*
int(0)
int(1)
int(2)
*/

а

for($i = 0;$i<3; $j = ++$i )var_dump($j);
/*
NULL
int(1)
int(2)
*/
for($i = 0;$i<3; $j = $i++ )var_dump($j);
/*
NULL
int(0)
int(1)
*/

Ответ 6

Разница: ++$i будет увеличивать переменную $i и возвращать обновленное значение, а $i++ будет возвращать исходное значение, поэтому увеличивайте его.

$prefix = 1;
$postfix = 1;
echo ++$prefix;   // 2
echo $postfix++;  // 1

Ответ 7

Чтобы объяснить точку jldupont:

$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3

Ответ 8

Еще один способ рассмотрения pre и post incrementing состоит в том, что он сокращает объединение двух операторов.

Предварительно приращение

// long form
$y = $y + 1;
$x = $y; // any statement using $y

// shorthand
$x = ++$y; // the same statement using $y

После приращения

// long form
$x = $y; // any statement using $y
$y = $y + 1;

// shorthand
$x = $y++; // the same statement using $y

Ответ 9

Основная цель оператора приращения post-fix заключается в следующем:

while(*condition*)
    $array[$i++] = $something;

Это очень элегантный способ, как обойти некоторые итерации массива. Структура:

  • Переменная $something будет присвоена элементу массива с индексом $i
  • Переменная $i будет увеличена
  • Итерация завершена, условие будет проверено.

Во всех остальных случаях вы должны использовать префиксный оператор. Это делает код более понятным (вы можете быть уверены, что вы уже работаете с добавочным значением конкретной переменной).

Ответ 10

Вероятно, это лучше всего иллюстрируется примером...

постинкремента:

$zero = 0;
$n = $zero++; //$n is zero

Преинкремент:

$zero = 0;
$n = ++$zero; //$n is one

Ответ 11

Короткий ответ:

  • Префикс увеличивает значение и возвращает увеличенное значение.
  • Postfix увеличивает значение и возвращает значение до его увеличения.
  • Префикс быстрее

Длинный ответ: Если вы немного об этом подумаете, как бы вы их реализовали, вы, вероятно, поймете, почему префикс быстрее. По правде говоря, postfix фактически (часто) реализован с использованием префикса:

const T T::operator ++ (int) // postfix
    {
    T orig(*this);
    ++(*this); // call prefix operator
    return (orig);
    }

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

Я действительно посмотрел это несколько дней назад. Вот мой источник.

Ответ 12

этот пример просто просто

<?php 

        $x = 10;  

        echo $x++. ' '.$x;   //  the result is 10 and 11

        echo "<br>";

        $y = 10;

        echo ++$y. ' ' .$y; // the result is 11 and 11

// so the  $x++ is not showing  +1 at first but the next time
// and the ++y is showing  +1 first time but not increasing next

?>

Ответ 13

Я проверил следующий код, чтобы проверить, что ++ $i на 10% быстрее, чем $i ++. Я признаю, что код не имеет стабильного результата, но даже тогда я должен хотя бы увидеть некоторые цифры около 10%. Самое высокое, что я получил, было примерно 4-4,5%.

<?php

$randomFloat = rand(0, 10) / 10;

$before1 = microtime(true);

for($i=0; $i <1000000; ++$i){
    $rand = (rand(0, 10) / 10) * (rand(0, 10) / 10);
}

$after1 = microtime(true);
echo 'it took '.($after1-$before1) . ' seconds fot ++$i<br />';

$before2 = microtime(true);

for($i=0; $i <1000000; $i++){
    $rand = (rand(0, 10) / 10) * (rand(0, 10) / 10);
}

$after2 = microtime(true);
echo 'it took '.($after2-$before2) . ' seconds fot $i++<br /><br />';

echo '++$i is '.((($after1-$before1)*100)/($after2-$before2)-100).'% faster than $i++';