SORU
30 EYLÜL 2010, PERŞEMBE


Neden bu sonsuz bir döngüye girer ki?

Ben bir öğretmenim, ve dün bir öğrenci aşağıdaki kodu yazdı:

public class Tests {
    public static void main(String[] args) throws Exception {
        int x = 0;
        while(x<3) {
            x = x  ;
            System.out.println(x);
        }
    }
}

x = x ; ilk önce kendisi için x özniteliği gerekir, ve sonra x artış sadece x x=x 1, yazmışsın ama o gerektiğini biliyoruz. Neden x değeri 0 ile devam ediyor?

--güncelleştirin

İşte bayt kodu:

public class Tests extends java.lang.Object{
public Tests();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[])   throws java.lang.Exception;
  Code:
   0:   iconst_0
   1:   istore_1
   2:   iload_1
   3:   iconst_3
   4:   if_icmpge   22
   7:   iload_1
   8:   iinc    1, 1
   11:  istore_1
   12:  getstatic   #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   15:  iload_1
   16:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
   19:  goto    2
   22:  return

}

instructions hakkında anlamak için okuyacağım...

CEVAP
30 EYLÜL 2010, PERŞEMBE


NotBaşlangıçta yayınlanan C# C yana gösterim amacıyla bu yanıt kodu# ref anahtar kelime ile başvuru int parametreleri geçmesine izin verir. Gerçek yasal Java kod C MutableInt birinci sınıf ref ne tür yaklaştığı Google'da buldum onu kullanarak update etmeye karar verdim#. Gerçekten eğer o ya da cevap yardımcı olursa acı veriyor anlatamam. Ben şahsen çok fazla Java geliştirme yapmadım; bütün bu noktada göstermek için çok daha deyimsel yolları olabilir diye biliyorum diyecekler.


Belki dışarı x ne denk yapmak için bir yöntem yazsak bu daha net hale getirecek.

public MutableInt postIncrement(MutableInt x) {
    int valueBeforeIncrement = x.intValue();
    x.add(1);
    return new MutableInt(valueBeforeIncrement);
}

Değil mi? Artış değer ve orijinal değerinin geçti geri: bu postincrement operatör tanımı.

Şimdi, diyelim ki bu davranış örnek kodu nasıl oynadığını görmek:

MutableInt x = new MutableInt();
x = postIncrement(x);

postIncrement(x) nedir? Aralıklarla 14**, Evet. Ve sonra15* *ne döndürürolduartış önce. Bu bir dönüş değeri o zaman 16* *atanır.

Değerler x atanmış sırası 0, sonra 1, sonra 0.

Bu bizim net hala yeniden yazmak yukarıda olabilir:

MutableInt x = new MutableInt();    // x is 0.
MutableInt temp = postIncrement(x); // Now x is 1, and temp is 0.
x = temp;                           // Now x is 0 again.

Düşkünlüğün aslında o zaman senin yerine x sol yukarıdaki atama ile y, "gördüğünüz gibi bu ilk adımlarla x, ve sonra özellikler için y" grev benim kadar şaşkın. y; tayin ediliyor x değildirdeğeri eskiden x atanmış. Gerçekten, y enjekte şeyler senaryo farklı yukarıda yapar; sadece var:

MutableInt x = new MutableInt();    // x is 0.
MutableInt y = new MutableInt();    // y is 0.
MutableInt temp = postIncrement(x); // Now x is 1, and temp is 0.
y = temp;                           // y is still 0.

Açık o yüzden: x = x etkili bir şekilde x değerini değiştirmez. Her zaman x değerleri x neden olur0x sonra01, ve sonra x0yine.


Güncelleme: Bu arada, sakın şüphe x hiç alır atanan 1 "arasında" artırma işlemi ve atama yukarıdaki örnekte, ben araya atılan hızlı bir demo için gösteren bu ara değer mi gerçekten "var," ama asla "görüldü" yürütme iş parçacığı.

Demo ayrı bir konu sürekli x değeri konsol yazdırılırken bir döngü içinde x = x ; çağırır.

public class Main {
    public static volatile int x = 0;

    public static void main(String[] args) {
        LoopingThread t = new LoopingThread();
        System.out.println("Starting background thread...");
        t.start();

        while (true) {
            x = x  ;
        }
    }
}

class LoopingThread extends Thread {
    public @Override void run() {
        while (true) {
            System.out.println(Main.x);
        }
    }
}

Aşağıda, yukarıdaki programın çıktısı bir alıntı. Hem de 1'ler ve 0'lar düzensiz geçtiği dikkat edin.

Starting background thread...
0
0
1
1
0
0
0
0
0
0
0
0
0
0
1
0
1

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bobbylee Budde

    Bobbylee Bud

    13 ŞUBAT 2011
  • BrandonHarrisWalker

    BrandonHarri

    27 Kasım 2006
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008