2009-11-18 15 views
58

PHPの++$i$i++の違いは何ですか?

答えて

69

++$iは、ポストインクリメント$i++です。

  • プリインクリメント:変数iを先に展開してから参照解除します。
  • ポストインクリメント:デリファレンスし、その後i

をインクリメント「PHP は、あなたがポストインクリメントする($ iの++) プレインクリメント(++ $を可能にするという事実を利用してくださいi)。 の意味は、あなたが $ X = $ i ++、 のようなものを書いていない限り同じですが、プリインクリメントはほぼ10%です。 より速くなります。つまり、 は、あなたが機会を得たときに を増やすと、 特にきついループでは が特にお勧めです。 マイクロ最適化をお勧めします。 - さらに明確化のためTuxRadar

、PHPにおけるポストインクリメントはプリインクリメント対この10%のオーバーヘッドに属性一時変数を格納するものとして報告されています。 jldupontのポイントを説明するために

+0

elplains。 10%は私にはたくさんあるようです – knittl

+6

これは一般的な経験則か、PHP固有のものですか? – Zoidberg

+0

...ソースは私の答えに記載されています。私は自分自身でそれをチェックアウトしていない...私はPHPのソースコードを見てもできると思います... – jldupont

9
++$i //first increment $i then run line 
$i++ //first run line then increment $i 
+0

技術的には単純化すぎる –

3

$i = 1; 
$x = $i++; 
echo $x; // prints 1 
$x = ++$i; 
echo $x; // prints 3 
4

は違いは次のとおりです。$i++は元の値を返すので、それをインクリメントする一方++$iは、$i変数をインクリメントし、更新された値を返します。

$prefix = 1; 
$postfix = 1; 
echo ++$prefix; // 2 
echo $postfix++; // 1 
1

ポストインクリメント:

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

プリインクリメント:

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

++$iは、プリインクリメント

  1. $iがインクリメントされる
  2. 新しい値が

$i++は、ポストインクリメント

  1. ある
  2. を返された古いの
  3. 内部コピーをインクリメントさ
  4. $i内部の一時変数にコピー$iの値$iの値が返されます。
25

++$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; 
1

短い答え:

  • プレフィックスは、値を増加し、値が
  • を高め返します
  • Postfixは値を大きくして値を大きくする前に値を返します
  • プレフィックスは速く

ロング答えは:あなたはそれについて少し考えて場合プレフィックスが高速である理由を、あなたがそれらを自分で実装する方法を、あなたはおそらくを実現します。あなたがいないに特別な理由がない限り、

const T T::operator ++ (int) // postfix 
    { 
    T orig(*this); 
    ++(*this); // call prefix operator 
    return (orig); 
    } 

避け接尾:語られる真実、Postfixは(多くの場合)実際には接頭辞を使用してを実装しました。複雑なデータ型の場合、速度の差はかなり大きくなる可能性があります。

私は実際に数日前にこれを見ました。Heres my source.

3

プレインクリメントとポストインクリメントを調べるもう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 
9

違いはありません。

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) 
*/ 
+0

これは便利ですが、プレフィックスのインクリメントが最も驚くようです。私はいつもプレフィックスインクリメントを使用して今に切り替えるつもりです。 – CMCDragonkai

0

++ $ 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++'; 
3

接尾インクリメント演算子の主な目的は、このような使用方法です。 内訳:

  1. 変数$何かが、私は
  2. イテレーションをインクリメントします$ I
  3. 変数$が末尾にある、条件
をチェックされますとインデックスとする配列要素に割り当てられます

その他の場合は、接頭辞演算子を使用する必要があります。これはコードをはるかに明確にします(特定の変数のインクリメントされた値ですでに作業していることは確かです)。

+0

接頭辞を厳密に必要としない限り、接頭辞の使用を推奨します。 – developerbmw

2

は、この例では、私はあなたの引用のソースに本当に興味が単に

<?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 

?> 
+0

簡単な例ありがとうございます。今、私は分かる。 – Praditha

関連する問題