PHP'de ++ $ i ve $ i ++ arasındaki fark nedir?


82

PHP arasındaki ++$ive $i++arasındaki fark nedir ?

Yanıtlar:


96

++$iartıştan $i++sonra ön artıştır.

  • ön artış: iönce değişkeni artırın ve ardından referansı kaldırın.
  • artım sonrası: referansı kaldırma ve ardından artırma 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.


6
Bu genel bir kural mı yoksa PHP'ye özel mi?
Zoidberg

1
... kaynak cevabımda listeleniyor. Kendim kontrol etmedim ... sanırım PHP'nin kaynak koduna bakarak yapabilirim ...
jldupont

3
Ben de başka bir dile genellemezdim.
jldupont

3
Arttırmanın hız artışı, artım sonrası geçici bir değişken oluşturarak ek yük yarattığı için PHP'ye özgüdür.
Corey Ballou

4
@knittl Çok hızlı bir operasyonun % 10'u olduğunu unutmayın :)
jensgram

68

++$iartışlarla $i, ancak değerine değerlendirir $i+1 $i++artışlarla $ieski 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;

4
Bu daha iyi cevap. Kod örnekleri olmadan bunun ne yaptığına dair genel bir genelleme anlamsızdır. Bu tür cevaplara verilen olumlu oylar, muhtemelen nasıl çalıştığını zaten bilen ve bu nedenle harika cevaplar olduklarını düşünenlerden geliyor.
James

Eminim alt düzeyde bundan fazlası vardır, bu yüzden bu soru tartışmalı olabilir. Fakat PHP neden temp değişkenine ihtiyaç duysun? Neden olmasın: $ a = $ i; $ i = $ i + 1;
Taylor Vance

@Taylor, Bu harika bir soru! $ $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.
Shalom Craimer

43

++$i ön artış

  1. $i artırıldı
  2. yeni değer döndürülür

$i++ artım sonrası

  1. $idahili bir geçici değişkene kopyalanan değer
  2. $i artırıldı
  3. eski değerinin dahili kopyası $idöndürülür

14
++$i //first increment $i then run line
$i++ //first run line then increment $i 

Bu teknik olarak aşırı basitleştirme - for döngüsünü düşünün vb.
Antony Carthy

11

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 yararlıdır, önek artışının en az sürpriz olduğu görülüyor. Şimdi her zaman ön ek artışını kullanmaya geçeceğim.
CMCDragonkai

8

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

Basit örnek için teşekkürler. Şimdi anlıyorum.
Praditha

7

Fark şudur: değişkeni ++$iartırır $ive 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

5

Jldupont'un amacını açıklamak için:

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

4

Ö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

4

$ 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!


3

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

3

Kısa cevap:

  • Önek, değeri artırır ve artan değeri döndürür
  • Postfix, değeri artırır ve değeri artırılmadan önce döndürür
  • Önek daha hızlı

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.


3

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:

  1. $ İ değişkeni, $ i ile indekslenen dizi öğesine atanacak
  2. $ İ değişkeni artırılacak
  3. Yineleme sonunda, koşul kontrol edilecek

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).


Bir sonek kesinlikle gerekli olmadıkça ön ek kullanılmasını önerdiği için oy verildi.
developerbmw

0

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

-1

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.