2011-11-25 14 views
18

thể trùng lặp:
Varying behavior for possible loss of precisionTại sao Java thực hiện chuyển đổi loại ngầm từ đôi thành số nguyên khi sử dụng toán tử "plus equals"?

Mã Mẫu Một

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

Mã mẫu B

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

Unsurprisin gly, biên dịch A tạo ra lỗi dưới đây. Đáng ngạc nhiên, biên dịch B không có lỗi và nó xuất hiện để hành xử như thể tôi chèn một diễn viên rõ ràng để số nguyên trước khi giá trị gấp đôi 1.5. Tại sao điều này lại xảy ra? Điều này đi ngược lại mọi thứ tôi nghĩ tôi biết!

Test.java:6: possible 

loss of precision 

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

@ Dave là đúng trên một phần bối rối. Ồ, không có ngôn ngữ nào là hoàn hảo. :) –

Trả lời

13

Nó đang hoạt động như được thiết kế. Các toán tử ghép cộng thêm một diễn viên ngầm vào hoạt động. Nếu không, bạn phải sử dụng một diễn viên rõ ràng.

Thông tin thêm?

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

+2

+1 Câu trả lời hay nhưng đây là liên kết trực tiếp hơn: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5304 –

+1

Đủ công bằng về liên kết. Cảm ơn! – Mechkov

+0

Tuyệt vời, cảm ơn bạn đã liên kết, Ray. – danmcardle

4

Theo Java language specification, section 15.26.2:

Một biểu thức phân công hợp chất có dạng E1 op = E2 tương đương với E1 = (T) ((E1) op (E2)), trong đó T là loại E1, ngoại trừ E1 chỉ được đánh giá một lần. Ví dụ, đoạn mã sau là đúng:

short x = 3; 
x += 4.6; 

và kết quả trong x có giá trị 7 vì nó tương đương với:

short x = 3; 
x = (short)(x + 4.6); 
Các vấn đề liên quan