Java Puzzle 09 – Compound Assignment

Merhaba Arkadaslar,
Atistirmalik Java kodlarimiza devam ediyoruz.

x+=i;
x=x+i;

Bircok Javaci , birinci ifadenin(statement) , ikinci ifadenin(statement) kisaltilmisi olarak dusunmektedir.Bu tam olarak dogru degildir. Iki ifade de assignment expression(atama ifadesidir). Ikinci ifade(statement) simple assignment/basit atama operatorunu (=) kullanmaktadir. Birinci ifade(statement) ise compound(birlesik) assignment operatorunu kullanmaktadir.

Compound assignment(birlesik atama);

E1 op= E2  ifadesi
E1 =(T)((E1)op (E2)) ifadesine denk gelmektedir.

Burada T , E1 tipidir.

Buradaki ifadenin anlami sudur ; compound assignment operator(birlesik atama ifadesi) otomatik olarak cast/ islemine tabi tutulur.
Eger sonuc tipi ile degiskenin tipi ayni ise cast isleminin bir etkisi yoktur. Fakat degil ise hidden cast soz konusu olacaktir.

short x=0;
int i=123456;

x+=i; // sorunsuzca calisir, gizli cast islemi yapilir.

x=x+i; // derleme hatasi verir, "possible loss of precision"

CompoundAssignment.java

package _09.compound.assignment;

public class CompoundAssignment {
	public static void main(String[] args) {
		int i = 123456;
		short x = 0;
		x += i;
		// x=x+i; // "possible loss of precision"
		System.out.println(x);// -7616

		int j = 1000;
		byte b = 0;
		b += j;
		System.out.println(b); // -24

		float f = 0;
		double d = 11.123456789;
		f += d;
		System.out.println(f); // 11.123457
	}
}

compound assignment (birlesik atama) operatoru ile yapilan islemlerin sonuclari tehlikeli olabilir. Istenmeyen durumlara karsi byte, short, char gibi tipleri int tipi ile kullanmaktan kacinmak dogru olacaktir. float ile kullandigimiz zamanda ise benzer sekilde sag tarafin double olmamasina dikkat edelim.

Bir baska nokta olarak , yukaridaki ornegimiz icin

x +=i; //legal
x = x+i; //illegal, compiler error

Olan senaryoyu inceledik tam ters durum olarak su noktayi inceleyelim;

x +=i; //illegal , compiler error
x = x+i; //legal

Compound operatorunde , iki operand da primitive ya da Wrapper olabilir. Istisna olarak += operatoru icin right-hand/sag taraf herhangi bir tip olabilir left-hand/sol taraf sadece String olabilir.

Bu durum JDK6 da mevcuttur. JDK7 ve JDK8 icin sol taraf java.lang.Object sinifi da olabilir.

CompoundAssignmentStringConcat.java

package _10.compound.assignment;

public class CompoundAssignmentStringConcat {

	public static void main(String[] args) {
		Object x = "injava";
		String i = "wetrust.com";

		x = x + i;

		Object y = "injava";
		String j = "wetrust.com";

		y += j;
		// The operator += is undefined for the argument type(s) Object, String
		// JDK 6
		// It is legal with JDK 7 , JDK8

		System.out.println(x);
		System.out.println(y);

		String z = "aaa";
		int number = 100;
		z += number;

		System.out.println(z);
	}
}

Yazimi burada sonlandiriyorum.
Herkese bol Javali gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *