В чем разница между ++$i
и $i++
в PHP?
++$i
является предварительным приращением, а пост-приращение $i++
.
i
а затем отменять ссылку. i
«Воспользуйтесь тем фактом, что PHP позволяет вам вводить приращение ($ i ++) и pre-increment (++ $ i). Значение такое же, пока вы не пишете ничего, как $ j = $ i ++, однако pre-incrementing почти на 10% быстрее, а это означает, что вы должны переключаться с post-to pre-incrementing, когда у вас есть такая возможность, особенно в жестких циклах, и особенно если вы педантичны в отношении микрооптимизаций! " – 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
Иногда для использования $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
Чтобы объяснить точку зрения Йлдупонта:
$i = 1; $x = $i++; echo $x; // prints 1 $x = ++$i; echo $x; // prints 3
Еще один способ рассмотрения pre и post incrementing состоит в том, что это сокращение для объединения двух операторов.
Pre-инкрементация
// 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
Основной целью оператора приращения post-fix является использование следующим образом:
while(*condition*) $array[$i++] = $something;
вwhile(*condition*) $array[$i++] = $something;
Это очень элегантный способ, как обойти некоторые итерации массива. Сломать:
Во всех остальных случаях вы должны использовать префиксный оператор. Это делает код более понятным (вы можете быть уверены, что вы уже работаете с добавочным значением конкретной переменной).
Вероятно, это лучше всего иллюстрируется примером …
Пост-инкремент:
$zero = 0; $n = $zero++; //$n is zero
Преинкремент:
$zero = 0; $n = ++$zero; //$n is one
Короткий ответ:
Длинный ответ: если вы немного об этом подумаете, как бы вы их реализовали, вы, вероятно, поймете, почему префикс работает быстрее. По правде говоря, postfix фактически (часто) реализован с использованием префикса:
const TT::operator ++ (int) // postfix { T orig(*this); ++(*this); // call prefix operator return (orig); }
Избегайте постфикса, если у вас нет конкретной причины. Разница в скорости может быть довольно сложной для сложных типов данных.
Я действительно посмотрел это несколько дней назад. Это мой источник.
этот пример просто
<?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 ?>
Я проверил следующий код для проверки, если ++ $ 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++';