PHP arasındaki ++$i
ve $i++
arasındaki fark nedir ?
Yanıtlar:
++$i
artıştan $i++
sonra ön artıştır.
i
önce değişkeni artırın ve ardından referansı kaldırın.i
"PHP'nin artım sonrası ($ i ++) ve ön artırma (++ $ i) yapmanıza izin verdiği gerçeğinden yararlanın. $ J = $ i ++ gibi bir şey yazmadığınız sürece anlam aynıdır, ancak ön artırma neredeyse% 10 daha hızlıdır, bu da fırsatınız olduğunda, özellikle dar döngülerde ve özellikle mikro optimizasyon konusunda bilgiçiyseniz, sonradan artırmaya geçmeniz gerektiği anlamına gelir! " - TuxRadar
Daha fazla açıklama için, PHP'deki artım sonrası, bu% 10'luk ek yüke karşılık ön artışa atıfta bulunan geçici bir değişkeni depoladığı belgelenmiştir.
++$i
artışlarla $i
, ancak değerine değerlendirir $i+1
$i++
artışlarla $i
eski değerine, fakat değerlendirir $i
.
İşte bir örnek:
$i = 10;
$a = $i++;
// Now $a is 10, and $i is 11
$i = 10;
$a = ++$i;
// Now $a is 11, and $i is 11
Bazen kullanım için düşük bir performans maliyeti vardır $i++
. Bak, böyle bir şey yaptığında
$a = $i++;
Bunu gerçekten yapıyorsun:
$temporary_variable = $i;
$i=$i+1;
$a=$temporary_variable;
$a=func()++
İ'yi bunun gibi bir işlev çağrısıyla değiştirmeyi deneyin: ve kendinize bunu ++ olmadan ve func () işlevini birden çok kez çağırmadan nasıl yeniden yazabileceğinizi sorun.
++$i //first increment $i then run line
$i++ //first run line then increment $i
bu durumda hiçbir fark yoktur:
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)
*/
fakat:
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)
*/
bu örnek basitçe açıklıyor
<?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
Fark şudur: değişkeni ++$i
artırır $i
ve güncellenmiş değeri $i++
döndürür, orijinal değeri döndürür, bu nedenle artırın.
$prefix = 1;
$postfix = 1;
echo ++$prefix; // 2
echo $postfix++; // 1
Önceden ve sonradan artırmaya bakmanın bir başka yolu da, 2 ifadeyi birleştirmenin kısaltmasıdır.
Ön artırma
// long form
$y = $y + 1;
$x = $y; // any statement using $y
// shorthand
$x = ++$y; // the same statement using $y
Arttırma sonrası
// long form
$x = $y; // any statement using $y
$y = $y + 1;
// shorthand
$x = $y++; // the same statement using $y
$ i ++, artım sonrası olarak bilinir. Yalnızca $ i'nin orijinal değerini önce $ j'ye atadıktan sonra $ i değerini artırır.
++ $ i, ön artış olarak bilinir. Değeri $ j'ye atamadan önce $ i'nin değerini artırır, böylece $ i'nin güncellenmiş değeri $ j'ye atanacaktır.
Bu nedenle
$i = 4;
$j = $i++;
// Now, $i = 5 and $j = 4
$i = 4;
$j = ++$i;
// Now, $i = 5 and $j = 5
Bu teoriler benzer şekilde azaltma için de geçerlidir.
Bu yardımcı olur umarım!
Muhtemelen en iyi örnekle gösterilmiştir ...
Artış sonrası:
$zero = 0;
$n = $zero++; //$n is zero
Ön artış:
$zero = 0;
$n = ++$zero; //$n is one
Kısa cevap:
Uzun cevap: Biraz düşünürseniz, bunları kendiniz nasıl uygularsınız, muhtemelen önekin neden daha hızlı olduğunu anlayacaksınız . Gerçeği söylemek gerekirse, postfix aslında (genellikle) önek kullanılarak uygulanır :
const T T::operator ++ (int) // postfix
{
T orig(*this);
++(*this); // call prefix operator
return (orig);
}
Yapmamak için belirli bir nedeniniz yoksa postfix'ten kaçının. Hızdaki fark, karmaşık veri türleri için oldukça fazla olabilir.
Aslında buna birkaç gün önce baktım. İşte kaynağım.
Düzeltme sonrası artış operatörünün temel amacı şu şekilde kullanımdır:
while(*condition*)
$array[$i++] = $something;
Bu, bazı dizi yinelemelerinin etrafından dolaşmanın çok zarif bir yoludur. Yıkmak:
Diğer tüm durumlarda, önek operatörünü kullanmalısınız. Kodu çok daha net hale getirir (Zaten belirli bir değişkenin artırılmış değeriyle çalıştığınızdan emin olabilirsiniz).
++ $ i'nin $ i ++ 'dan% 10 daha hızlı olup olmadığını test etmek için aşağıdaki kodu çalıştırdım. Kabul ediyorum, kodun istikrarlı bir sonucu yok ama o zaman bile en azından% 10'a yakın bazı rakamlar görmüş olmalıydım. Aldığım en yüksek yaklaşık% 4-4,5 oldu.
<?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++';
Her iki operatör de sözdiziminin ima ettiği şeyi yapmaya devam eder: artırmak. Önek veya sonekten bağımsız olarak, değişken kesinlikle 1 artırılacaktır. İkisi arasındaki fark, dönüş değerlerinde yatmaktadır.
1. Önek artışı, artırıldıktan sonra bir değişkenin değerini döndürür.
2. Öte yandan, daha yaygın olarak kullanılan sonek artışı, artırılmadan önce bir değişkenin değerini döndürür.
// 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
Bu kuralı hatırlamak için ikisinin sözdizimini düşünüyorum. Bir önek artışını yazdığında, ++ x der. ++ 'nın konumu burada önemlidir. ++ x demek, önce artırmak (++) ve sonra x'in değerini döndürmek anlamına gelir, böylece ++ x'e sahibiz. Postfix artışı tersine çalışır. X ++ demek, önce x değerini döndürmek, sonra onu artırmak (++), dolayısıyla x ++ anlamına gelir.