Java’da İfadelerin Değeri ve Derleyici Davranışı
Java’da derleyiciler, derleme zamanında pek çok kontrol yaparlar. Derleyicilerin yaptığı bu kontrollerle ilgili en temel kısıt, derleyicilerin, derleme zamanında bilebilecekleridir. Bu şu demektir: İfadelerin değerleri çalışma zamanında belirlenir. Çünkü kodu çalıştırıp da koddaki bir ifadenin bulunduğu yere gelmeden, o ifadeyi oluşturan ya da etkileyen değişkenlerin hangi değerleri alacağını bilemeyiz, derleyici de bilemez. Dolayısıyla örneğin aşağıdaki gibi bir kod parçasında derleyici “k“nın değerinin ne olacağını bilir çünkü ona atanan bir tam sayı sabitidir ama “i“nin değerini bilemez ya da daha doğru ifadeyle bilmeye çalışmaz ve bu değer üzerine bir kontrol yapmaz:
int k = 2147483648;
int i = k + 1;
System.out.println(i);
Yukarıdaki kodun ilk satırı, derleme zamanında hata verecektir (çünkü “k“ya atanan değer bir “int“in gösterebileceği değerlerin dışındadır) ama 3. satırı için, derleyici “i“ye atanmaya çalışan değerin bir “int”in sınırları dışında olduğunu bilebilecek olmasına rağmen herhangi bir problem çıkarmayacaktır, çünkü derleyici, ifadelerin değerleriyle ilgilenmez.
İlk satırı “int k = 2147483647;” şeklinde değiştirin, derleme zamanı hatası yok olacaktır ama kodunuzu çalıştırdığınızda “i“, “-2147483648” olarak basılacaktır. (“i”nin değerinin neden böyle olduğu size ufak bir araştırma konusu olarak kalsın”.) Bu yüzden her durum için derleyiciye güvenmeyip, onun bilemeyeceği ifadelerin davranışını, programcı olarak bizim kontrol etmemiz gereklidir. Bu vesileyle de, birim testi yapmanın ne kadar önemli olduğunu da ifade edelim.
Bu durumun bir diğer göstergesi de aşağıdaki koddur:
int a = 8;
int k;
if(a > 11)
k = 7;
System.out.println(k);
Bu kodun 6. satırı, “k“nın bir ilk değer almamasından dolayı hata verecektir. (Malum, yerel değişkenler, nesne değişkenlerinin aksine, biz bir değer vermedikçe, otomatik olarak bir ilk değer almazlar.) Ama bu hatanın sebebi “a“nın 11‘den küçük olması değildir. Neden? Şimdi gidip “a”nın “11”de büyük olup olmadığını kontrol eden “if” ifadesini “if(a > 4)” ya da “if(a < 11)” olarak değiştirin. Hatanız düzeldi mi? Düzelmedi. Çünkü: Java derleyicisi, “if” içindeki ifadenin değerinin ne olduğuna bakarak bir analiz yapmaz, velev ki derleyici bu değeri derleme zamanında biliyor olsun. Biz kodumuzu “k = 7;” cümlesi çalışacak şekilde değiştirsek bile derleyici açısından birşey değişmemiştir: “k“nın bir ilk değer alması teorik olarak, mümkün olan 2 durumdan birinde söz konusudur, (çünkü “if” bu şekide çalışır,) ve bu kodda sadece bir tek durumda “k“ya bir ilk değer atanmaktadır, dolayısıyla da bu bir hatadır. Yukarıdaki koda “else” eklerseniz hata giderilecektir:
int a = 8;
int k;
if(a < 11)
k = 7;
else
k = 9;
System.out.println(k);
İşte bu yüzden programcılık "zor zanaat" ve programlama yapmak sabır işi 🙂
Toplam görüntülenme sayısı: 1016