PHPの++$i
と$i++
の違いは何ですか?
++$i
は事前インクリメントで、$i++
ポストインクリメント。
i
を最初にインクリメントしてから、逆参照します。i
をインクリメントします「PHPを使用すると、ポストインクリメント($ i ++)およびプリインクリメント(++ $ i)が可能になります。記述していない限り、意味は同じです。 $ j = $ i ++のようなものですが、事前インクリメントはほぼ10%高速です。つまり、特にタイトなループで、特にマイクロに精通している場合は、ポストインクリメントからプレインクリメントに切り替える必要があります。 -optimisations! "- TuxRadar
さらに明確にするために、PHPのポストインクリメントは、この10%のオーバーヘッド対プレインクリメントに起因する一時変数を格納するものとして文書化されています。
++$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
は事前インクリメントです
$i
はインクリメントされます$i++
はポストインクリメントです
$i
の値$i
はインクリメントされます$i
の古い値の内部コピーが返されます++$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)
*/
この例は単純に説明します
<?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
?>
Difference is:++$i
は$i
変数をインクリメントし、更新された値を返しますが、$i++
は元の値を返すため、インクリメントします。
$prefix = 1;
$postfix = 1;
echo ++$prefix; // 2
echo $postfix++; // 1
プリインクリメントとポストインクリメントを見るもう1つの方法は、2つのステートメントを結合するための略記法です。
事前インクリメント
// 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
Jldupontのポイントを説明するには:
$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3
修正後のインクリメント演算子の主な目的は、次のような使用法です。
while(*condition*)
$array[$i++] = $something;
これは非常にエレガントな方法で、配列の反復を回避する方法です。壊す:
その他の場合はすべて、プレフィックス演算子を使用する必要があります。これにより、コードがはるかに明確になります(特定の変数のインクリメントされた値で既に作業していることは確かです)。
短い答え:
長答:少し考えてみれば、それらを自分でどのように実装するのか、おそらくwhyプレフィックスは高速です。本当のことを言えば、postfixは実際に(多くの場合)実装されますusingプレフィックス:
const T T::operator ++ (int) // postfix
{
T orig(*this);
++(*this); // call prefix operator
return (orig);
}
特別な理由がない限り、後置は避けてください。速度の違いは、複雑なデータ型ではかなり大きくなる可能性があります。
私は実際にこれを数日前に調べました。 ここに私のソースがあります。
おそらく例によって最もよく示されています...
ポストインクリメント:
$zero = 0;
$n = $zero++; //$n is zero
事前インクリメント:
$zero = 0;
$n = ++$zero; //$n is one
次のコードを実行して、++ $ iが$ i ++より10%高速かどうかをテストしました。コードの結果は安定していませんが、それでも少なくとも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++';
どちらの演算子も構文が意味することを行います:インクリメントします。プレフィックスまたはポストフィックスに関係なく、変数は必ず1インクリメントされます。2つの違いは戻り値にあります。
1。接頭辞インクリメントは、変数がインクリメントされた後、変数の値を返します。
2。一方、より一般的に使用される後置インクリメントは、変数がインクリメントされる前の値を返します。
// Prefix increment
let prefix = 1;
console.log(++prefix); // 2
console.log(prefix); // 2
// Postfix increment
let postfix = 1;
console.log(postfix++); // 1
console.log(postfix); // 2
このルールを思い出すために、2つの構文について考えます。接頭辞の増分を入力すると、++ xと表示されます。ここでは、++の位置が重要です。 ++ xとは、最初にインクリメント(++)してからxの値を返すことを意味するため、++ xが得られます。後置インクリメントは逆に機能します。 x ++とは、最初にxの値を返し、その後に値をインクリメント(++)する、つまりx ++を返すことを意味します。