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