Bu Java kodunun çıktısını bana açıklar mısınız?
int a=5,i;
i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;
System.out.println(a);
System.out.println(i);
Her iki durumda da çıktı 20'dir
Bu Java kodunun çıktısını bana açıklar mısınız?
int a=5,i;
i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;
System.out.println(a);
System.out.println(i);
Her iki durumda da çıktı 20'dir
Yanıtlar:
Bu yardımcı olur mu?
a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)
a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)
Ana nokta, ++a
değeri artırması ve hemen döndürmesidir.
a++
ayrıca değeri artırır (arka planda) ancak değişkenin değişmemiş değerini döndürür - daha sonra çalıştırılacak gibi görünür.
int a = 1; int b = a++; int c = ++b;
Bir artım olduğu için b'nin 1 olmasını bekliyordum.
Her iki durumda da önce değeri hesaplar, ancak artım sonrası eski değeri tutar ve hesapladıktan sonra onu döndürür.
++ a
a ++
i = ++a + ++a + a++;
dır-dir
i = 6 + 7 + 7
Çalışma : a'dan 6'ya artış (mevcut değer 6) + a'dan 7'ye artırma (mevcut değer 7). Şimdi toplam 13'tür şimdi onu mevcut a (= 7) değerine ekleyin ve ardından a'yı 8'e yükseltin. Toplam 20'dir ve atama tamamlandıktan sonra a'nın değeri 8'dir.
i = a++ + ++a + ++a;
dır-dir
i = 5 + 7 + 8
Çalışma : a'nın başlangıç değerinde 5'tir. Eklemede kullanın ve sonra 6'ya yükseltin (mevcut değer 6). Diğer + işlenenini elde etmek için a'yı 6'dan 7'ye yükseltin. Toplam 12 ve a'nın mevcut değeri 7'dir. Sonraki a'yı 7'den 8'e yükseltin (mevcut değer = 8) ve 20 elde etmek için önceki toplam 12'ye ekleyin.
++a
a
değerlendirilmeden önce artar .
a++
değerlendirir a
ve sonra artırır.
Verdiğiniz ifadeyle ilgili:
i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end
Yukarıda kullandığım parantezler Java tarafından örtülü olarak kullanılıyor. Terimlere bu şekilde bakarsanız, her ikisinin de değişmeli oldukları gibi aynı olduklarını kolayca görebilirsiniz.
Kastettiğini varsayarsak
int a=5; int i;
i=++a + ++a + a++;
System.out.println(i);
a=5;
i=a++ + ++a + ++a;
System.out.println(i);
a=5;
a=++a + ++a + a++;
System.out.println(a);
Bu şu şekilde değerlendirilir:
i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)
yani i 6 + 7 + 7 = 20'dir ve bu nedenle 20 yazdırılır.
i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)
yani i 5 + 7 + 8 = 20'dir ve böylece 20 tekrar yazdırılır.
a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)
ve sağ tarafın tümü değerlendirildikten sonra (a'yı 8'e ayarlamak dahil) SONRA a, 6 + 7 + 7 = 20'ye ayarlanır ve böylece 20, son kez yazdırılır.
zaman a
5, daha sonra a++
ifade ve artışlarla bir 5 veren a
, daha sonra ise ++a
artışlarla a
(veren ekspresyonu için sayı geçirmeden önce a
, bu durumda ifade 6).
Yani hesapla
i = 6 + 7 + 7
i = 5 + 7 + 8
Ancak, tüm ifadelerinizi birleştirir ve Java 8.1'de çalıştırırsanız farklı bir yanıt alacağınıza inanıyorum, en azından benim deneyimim böyle diyor.
Kod şu şekilde çalışacaktır:
int a=5,i;
i=++a + ++a + a++; /*a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8); i=20;*/
i=a++ + ++a + ++a; /*a = 5;
i=a++ + ++a + ++a; =>
i=8 + 10 + 11; (a=11); i=29;*/
a=++a + ++a + a++; /*a=5;
a=++a + ++a + a++; =>
a=12 + 13 + 13; a=38;*/
System.out.println(a); //output: 38
System.out.println(i); //output: 29
Ön artış, değişkenin ifadede değerlendirilmeden ÖNCE artırıldığı anlamına gelir. Artış sonrası, değişkenin ifadede kullanılmak üzere değerlendirildikten SONRA artırıldığı anlamına gelir.
Bu nedenle dikkatlice bakın ve üç ödevin de aritmetik olarak eşdeğer olduğunu göreceksiniz.
a=5; i=++a + ++a + a++;
dır-dir
i = 7 + 6 + 7
Çalışma: ön / son artış, "sağdan sola" İlişkilendirme özelliğine sahiptir ve ön, gönderiye göre önceliğe sahiptir, bu nedenle her şeyden önce ön artış olarak çözülecektir (++a + ++a) => 7 + 6
. daha sonra a=7
artım göndermek için sağlanır => 7 + 6 + 7 =20
ve a =8
.
a=5; i=a++ + ++a + ++a;
dır-dir
i=7 + 7 + 6
Çalışma: pre / post artım olarak çözmek olacak böylece her şeyden önce ön artım Associativity ve öncesi "sol hakkı" yazı üzerinde önceliğe sahiptir, sahip (++a + ++a) => 7 + 6
.o a=7
sonrası artış sağlanmıştır => edilir 7 + 7 + 6 =20
ve a =8
.
Tüm bu ifadeleri farklı şekilde yürüttüğünüze inanıyorum
, sonuç olarak => 38, 29
int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated,
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)