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

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

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

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

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

Иногда для использования $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; 

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

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

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

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

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

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

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

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

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

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

Длинный ответ: если вы немного об этом подумаете, как бы вы их реализовали, вы, вероятно, поймете, почему префикс работает быстрее. По правде говоря, 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++';