PHPの++$i
と$i++
の違いは何ですか?
答えて
++$i
は、ポストインクリメント$i++
です。
- プリインクリメント:変数
i
を先に展開してから参照解除します。 - ポストインクリメント:デリファレンスし、その後
i
をインクリメント「PHP は、あなたがポストインクリメントする($ iの++) プレインクリメント(++ $を可能にするという事実を利用してくださいi)。 の意味は、あなたが $ X = $ i ++、 のようなものを書いていない限り同じですが、プリインクリメントはほぼ10%です。 より速くなります。つまり、 は、あなたが機会を得たときに を増やすと、 特にきついループでは が特にお勧めです。 マイクロ最適化をお勧めします。 - さらに明確化のためTuxRadar
、PHPにおけるポストインクリメントはプリインクリメント対この10%のオーバーヘッドに属性一時変数を格納するものとして報告されています。 jldupontのポイントを説明するために
++$i //first increment $i then run line
$i++ //first run line then increment $i
技術的には単純化すぎる –
:
$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3
は違いは次のとおりです。$i++
は元の値を返すので、それをインクリメントする一方++$i
は、$i
変数をインクリメントし、更新された値を返します。
$prefix = 1;
$postfix = 1;
echo ++$prefix; // 2
echo $postfix++; // 1
ポストインクリメント:
$zero = 0;
$n = $zero++; //$n is zero
プリインクリメント:
$zero = 0;
$n = ++$zero; //$n is one
++$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++
を使用するためのわずかなpreformanceのコストが時々あります。あなたが本当にやっているあなたが
$a = $i++;
ような何かを行う際に、参照してください。この:
$temporary_variable = $i;
$i=$i+1;
$a=$temporary_variable;
短い答え:
- プレフィックスは、値を増加し、値が を高め返します
- Postfixは値を大きくして値を大きくする前に値を返します
- プレフィックスは速く
ロング答えは:あなたはそれについて少し考えて場合プレフィックスが高速である理由を、あなたがそれらを自分で実装する方法を、あなたはおそらくを実現します。あなたがいないに特別な理由がない限り、
const T T::operator ++ (int) // postfix
{
T orig(*this);
++(*this); // call prefix operator
return (orig);
}
避け接尾:語られる真実、Postfixは(多くの場合)実際には接頭辞を使用してを実装しました。複雑なデータ型の場合、速度の差はかなり大きくなる可能性があります。
私は実際に数日前にこれを見ました。Heres my source.
プレインクリメントとポストインクリメントを調べるもう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
違いはありません。
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)
*/
これは便利ですが、プレフィックスのインクリメントが最も驚くようです。私はいつもプレフィックスインクリメントを使用して今に切り替えるつもりです。 – CMCDragonkai
++ $ iが$ i ++よりも10%高速であるかどうかをテストするために、次のコードを実行しました。私は、コードは安定した結果を持っていませんが、それでも少なくとも10%近くの数字を見たことがあるはずです。私が得た最高は約4-4.5%だった。
while(*condition*)
$array[$i++] = $something;
これは、いくつかの配列の繰り返しを回避する方法を、非常にエレガントな方法です:
<?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++';
接尾インクリメント演算子の主な目的は、このような使用方法です。 内訳:
- 変数$何かが、私は
- イテレーションをインクリメントします$ I
- 変数$が末尾にある、条件が
その他の場合は、接頭辞演算子を使用する必要があります。これはコードをはるかに明確にします(特定の変数のインクリメントされた値ですでに作業していることは確かです)。
接頭辞を厳密に必要としない限り、接頭辞の使用を推奨します。 – developerbmw
は、この例では、私はあなたの引用のソースに本当に興味が単に
<?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
?>
簡単な例ありがとうございます。今、私は分かる。 – Praditha
- 1. C++のx = ++ iとx = i ++の違いは何ですか?
- 2. javascriptの++ iとi + 1の違いは何ですか?
- 3. Cのiとi-1の違いは何ですか?
- 4. i ++と++ iの違いは何ですか?
- 5. if(!(s&i))とif(s&i == 0)の違いは何ですか?
- 6. ルビーの/ \ p {Alpha}/iと/ \ p {L}/iの違いは何ですか?
- 7. Numpy:a [i] [j]とa [i、j]の違い
- 8. I/OポートとI/Oメモリの違い
- 9. `sed -i -e`と` sed -ie`の違いは何ですか?
- 10. 「$ i = new b();」とは何ですか? $ i-> c = "d"; ' PHPで意味ですか?
- 11. Javascriptで「i = + i」とは何ですか? jqueryのソースで
- 12. gdbでは、 'where'、 'bt'、 'i frame'コマンドの違いは何ですか?
- 13. i <xの範囲と範囲(x)のiの違いは?
- 14. iノードのデバイスとは何ですか?
- 15. "for i in array"内のiのデータ型は何ですか
- 16. Delphiの "i:= i - $ 24"行の "$"は何ですか?
- 17. プログラム(ポーリング)I/O、割り込み駆動I/O、ダイレクトメモリアクセスの違いは何ですか?これらの形式のI/O OSは依存していますか?
- 18. void * p =&iとは何ですか?
- 19. FindClassとは何ですか( ".."、 "[I"])?
- 20. ^I in Pascalとは何ですか?
- 21. 再帰と - とi-1の違い
- 22. for(int i = 0; i <10; ++ i)とfor(int i = 0; i <10; i ++)は同じものを返しますか?
- 23. i = jの意味は何ですか -
- 24. I/Oの定義とは何か、I/Oとして分類されるアクションは何ですか?
- 25. 説明のI/Oとは何ですか?process.nextTickとsetImmediate?
- 26. Intelのコアi *とコアの数の関係は何ですか?
- 27. Math.random()* i |とは何ですか? 0は意味ですか?
- 28. "for i、val:list:..."という構文は何ですか?
- 29. 「int(i)= 1;」という意味は何ですか?
- 30. int i = 0とint i = default(int)の間にパフォーマンスの違いはありますか?
elplains。 10%は私にはたくさんあるようです – knittl
これは一般的な経験則か、PHP固有のものですか? – Zoidberg
...ソースは私の答えに記載されています。私は自分自身でそれをチェックアウトしていない...私はPHPのソースコードを見てもできると思います... – jldupont