13 ответов:
++$iявляется предварительным приращением в то время как$i++пост-инкремент.
- pre-increment: переменная инкремента
iсначала, а потом разыменовывать.- пост-инкремент: де-ссылка, а затем инкремент
i" воспользуйтесь тем, что PHP позволяет пост-инкремент ($i++) и предварительное приращение (++$i). Значение это то же самое, пока вас нет написание чего-нибудь вроде $j = $i++, однако предварительное приращение является почти 10% быстрее, что означает, что вы должны переход от пост - к пре-увеличения когда у вас есть возможность, особенно в плотных петлях и особенно если вы педантичны микро-оптимизация!" - TuxRadar
для дальнейшего выяснения, после изменения в PHP было описано как хранение временной переменной, которая приписывает эти 10% накладные и предварительно приращения.
++$iэто предварительное приращение
$iувеличивается- возвращается новое значение
$i++это пост-инкремент
- значение
$iскопировано во внутреннюю временную переменную$iувеличивается- внутренняя копия старого значения
$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;
в этом случае нет никакой разницы:
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;Это очень элегантный способ, как обойти некоторые итерации массива. Разбивка:
- переменная $something будет присвоена элементу массива, индексированному с помощью $i
- переменная $i будет увеличена
- итерация в конце условие будет проверен
во всех остальных случаях следует использовать префикс оператор. Это делает код гораздо более понятным (вы можете быть уверены, что уже работаете с увеличенным значением конкретной переменной).
это, вероятно, лучше всего иллюстрируется примером...
пост-инкремент:
$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