Java Dil Şartname tanımlar E1 op= E2
eşdeğer olduğu E1 = (T) ((E1) op (E2))
yerde T
türüdür E1
ve E1
bir kez değerlendirilir .
Bu teknik bir cevap, ama bunun neden böyle olduğunu merak ediyor olabilirsiniz. Peki, aşağıdaki programı ele alalım.
public class PlusEquals {
public static void main(String[] args) {
byte a = 1;
byte b = 2;
a = a + b;
System.out.println(a);
}
}
Bu program ne yazdırıyor?
3'ü tahmin ettin mi? Çok kötü, bu program derlenmeyecek. Neden? Java'da bayt eklemenin birint
. Bunun nedeni, Java Sanal Makinesi'nin bayt kodlarını kaydetmek için bayt işlemlerini tanımlamamış olmasından kaynaklanmaktadır (sonuçta sınırlı sayıda vardır), bunun yerine tamsayı işlemlerini bir dilde açıklanmış bir uygulama detayı kullanmaktır.
Fakat eğer a = a + b
işe yaramazsa, a += b
bu E1 += E2
, tanımlandığı takdirde baytlar için asla işe yaramayacağı anlamına gelir E1 = E1 + E2
. Önceki örnekte gösterildiği gibi, bu gerçekten de durum böyle olurdu. Yapmak için bir hack olarak +=
bayt ve şort operatör çalışmaları, ilgili örtük dökme yoktur. Bu bir hack büyük değil, ama Java 1.0 çalışması sırasında, odak noktası dili başlamak için başladı. Artık geriye dönük uyumluluk nedeniyle Java 1.0'da tanıtılan bu saldırı kaldırılamadı.