web-dev-qa-db-ja.com

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

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

70
Steven

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

  • 事前インクリメント:変数iを最初にインクリメントしてから、逆参照します。
  • ポストインクリメント:参照解除してからiをインクリメントします

「PHPを使用すると、ポストインクリメント($ i ++)およびプリインクリメント(++ $ i)が可能になります。記述していない限り、意味は同じです。 $ j = $ i ++のようなものですが、事前インクリメントはほぼ10%高速です。つまり、特にタイトなループで、特にマイクロに精通している場合は、ポストインクリメントからプレインクリメントに切り替える必要があります。 -optimisations! "- TuxRadar

さらに明確にするために、PHPのポストインクリメントは、この10%のオーバーヘッド対プレインクリメントに起因する一時変数を格納するものとして文書化されています。

85
jldupont

++$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;
50
Shalom Craimer

++$iは事前インクリメントです

  1. $iはインクリメントされます
  2. 新しい値が返されます

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

  1. 内部一時変数にコピーされた$iの値
  2. $iはインクリメントされます
  3. $iの古い値の内部コピーが返されます
38
Gumbo
++$i //first increment $i then run line
$i++ //first run line then increment $i 
12
Sajad Bahmani

この場合、違いはありません。

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)
*/
9
user669677

この例は単純に説明します

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

?>
6
Ashraful Alam

Difference is:++$i$i変数をインクリメントし、更新された値を返しますが、$i++は元の値を返すため、インクリメントします。

$prefix = 1;
$postfix = 1;
echo ++$prefix;   // 2
echo $postfix++;  // 1
4
Rubens Farias

プリインクリメントとポストインクリメントを見るもう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
3
Michael

Jldupontのポイントを説明するには:

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

修正後のインクリメント演算子の主な目的は、次のような使用法です。

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

これは非常にエレガントな方法で、配列の反復を回避する方法です。壊す:

  1. 変数$ somethingは、$ iでインデックス付けされた配列要素に割り当てられます
  2. 変数$ iがインクリメントされます
  3. 反復は終了です。条件がチェックされます

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

3
user3554809

短い答え:

  • プレフィックスは値を増やし、値を増やして返します
  • Postfixは値を増やし、値が増える前に値を返します
  • プレフィックスは高速です

長答:少し考えてみれば、それらを自分でどのように実装するのか、おそらくwhyプレフィックスは高速です。本当のことを言えば、postfixは実際に(多くの場合)実装されますusingプレフィックス:

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

特別な理由がない限り、後置は避けてください。速度の違いは、複雑なデータ型ではかなり大きくなる可能性があります。

私は実際にこれを数日前に調べました。 ここに私のソースがあります。

1
Mizipzor

おそらく例によって最もよく示されています...

ポストインクリメント:

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

事前インクリメント:

$zero = 0;
$n = ++$zero; //$n is one
1
brianreavis

次のコードを実行して、++ $ 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++';
0
Waxyen Flax

どちらの演算子も構文が意味することを行います:インクリメントします。プレフィックスまたはポストフィックスに関係なく、変数は必ず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 ++を返すことを意味します。

0
Rohit Saini