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

Neden GCC ile x 86 tamsayı taşması son...
Neden bu yöntem sonsuz bir döngüye ned...
Hayır genişlik/yükseklik maddeleri aya...
Nasıl bir çöp toplayıcı, sonsuz bir dö...
Neden kayan nokta sonsuz, NaNs aksine,...