2011-11-25 20 views
18

Olası Çoğalt:
Varying behavior for possible loss of precisionJava, neden "artı eşittir" operatörünü kullanırken tam sayıdan tam sayıya kadar örtülü bir dönüşüm gerçekleştiriyor?

Kod A

public class Test {               
    public static void main(String[] args) { 
     int i = 0; 
     i = i + 1.5; 
    } 
} 

Kod örnek B

public class Test {               
    public static void main(String[] args) { 
     int i = 0; 
     i += 1.5; 
    } 
} 

Unsurprisin Örnek G, derleme A, aşağıdaki hatayı üretir. Şaşırtıcı, B derleme bir hata üretir ve Çift değeri 1.5 önce tamsayıya açık döküm takılı gibi davranır görünmektedir. Neden dünyada böyle bir şey oluyor? Bu bildiğimi düşündüğüm her şeye karşı geliyor!

Test.java:6: possible 

loss of precision 

    found : double 
    required: int 
      i = i + 1.5; 
       ^
    1 error 
+1

@Dave doğru endişe parçası. Oh, iyi dil yok. :) –

cevap

13

Tasarlanan şekilde çalışıyor. Bileşik operatörler, işlem için örtülü bir döküm ekler. Aksi halde açık bir oyuncu kullanmanız gerekir.

diğer bilgiler?

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

+2

+1 İyi cevap ama burada daha doğrudan bir bağlantı var: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5304 –

+1

Bağlantı hakkında yeterince iyi. Teşekkürler! – Mechkov

+0

Harika, bağlantı için teşekkürler, Ray. – danmcardle

4

Java language specification, section 15.26.2 göre:

şekilde E1 op ait bir bileşik atama sentezleme = E2, E1 = (T) ((E1) OP (E2)) eşdeğerdir, T burada E1'in türü, sadece E1'in bir kez değerlendirildiği hariç. Örneğin, aşağıdaki kod doğruysa:

short x = 3; 
x += 4.6; 

ve eşdeğer olduğundan değeri 7 olan x sonuçları:

short x = 3; 
x = (short)(x + 4.6); 
İlgili konular