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



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

762   13  

13 ответов:

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

  • pre-increment: переменная инкремента i сначала, а потом разыменовывать.
  • пост-инкремент: де-ссылка, а затем инкремент i

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

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

++$i это предварительное приращение

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

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

  1. значение $i скопировано во внутреннюю временную переменную
  2. $i увеличивается
  3. внутренняя копия старого значения $i возвращается

++$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

иногда небольшая цена preformance для использования $i++. Видите, когда вы делаете что-то вроде

$a = $i++;

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

$temporary_variable = $i;
$i=$i+1;
$a=$temporary_variable;
++$i //first increment $i then run line
$i++ //first run line then increment $i 

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

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)
*/

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

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

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

<?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

?>

чтобы объяснить точку зрения jldupont:

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

Pre-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

основной целью оператора приращения после исправления является использование следующим образом:

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

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

  1. переменная $something будет присвоена элементу массива, индексированному с помощью $i
  2. переменная $i будет увеличена
  3. итерация в конце условие будет проверен

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

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

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

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

предварительный шаг:

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

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

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

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

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

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

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

Я запустил следующий код, чтобы проверить, если ++$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++';

Comments

    Ничего не найдено.