В чем разница между ++ $ i и $ i ++ в PHP? - PullRequest
68 голосов
/ 18 ноября 2009

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

Ответы [ 14 ]

83 голосов
/ 18 ноября 2009

++$i - это предварительное увеличение, а $i++ после увеличения.

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

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

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

47 голосов
/ 18 ноября 2009

++$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;
38 голосов
/ 18 ноября 2009

++$i - предварительное увеличение

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

$i++ является постинкрементным

  1. значение $i, скопированное во внутреннюю временную переменную
  2. $i увеличивается
  3. возвращается внутренняя копия старого значения $i
12 голосов
/ 18 ноября 2009
++$i //first increment $i then run line
$i++ //first run line then increment $i 
9 голосов
/ 18 июня 2012

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

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 голосов
/ 03 августа 2017

этот пример 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

?>
4 голосов
/ 18 ноября 2009

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

$prefix = 1;
$postfix = 1;
echo ++$prefix;   // 2
echo $postfix++;  // 1
3 голосов
/ 04 января 2016

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

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

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

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

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

3 голосов
/ 18 ноября 2009

Еще один способ взглянуть на приращение до и после записи - это сокращение для объединения двух операторов.

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
3 голосов
/ 18 ноября 2009

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

$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...