2012-12-08 35 views
9

Tôi đã tìm thấy rằng biên dịch java có hành vi không mong đợi liên quan đến các câu lệnh gán và tự gán bằng cách sử dụng một hàm int và float.chuyển đổi ngầm trong toán tử java + =

Khối mã sau minh họa lỗi.

int i = 3; 
    float f = 0.1f; 

    i += f;    // no compile error, but i = 3 
    i = i + f;   // COMPILE ERROR 
  • Trong tự phân i += f các biên dịch không phát hành một lỗi, nhưng kết quả của exaluation là một int có giá trị 3, và biến i duy trì giá trị 3.

  • Trong biểu thức i = i + f trình biên dịch đưa ra lỗi với thông báo "": có thể mất chính xác ".

Ai đó có thể giải thích hành vi này.

EDIT: Tôi đã đăng khối mã này trong https://compilr.com/cguedes/java-autoassignment-error/Program.java

+0

Đặc điểm ngôn ngữ Java là nơi bạn sẽ tìm thấy giải thích. Nó có sẵn trực tuyến miễn phí. –

+0

Để công bằng, "Chương 5. Chuyển đổi và Khuyến mãi" là nơi tôi sẽ có (và có) nhìn trước khi dò dẫm về câu hỏi này; chương 15 thậm chí không hiển thị trên trang đầu tiên tìm kiếm "Java thu hẹp chuyển đổi tiềm ẩn". Không tìm thấy thông tin không nhất thiết là dấu hiệu của việc không tìm kiếm và nhận xét của bạn không giúp ích gì theo bất kỳ cách nào –

Trả lời

11

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

Java Language Specification nói:

A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T) ((E1) op (E2)) , where T is the type of E1 , except that E1 is evaluated only once.

Vì vậy i += f tương đương với i = (int) (i + f).

+0

Câu trả lời hay. Tnks. –

Các vấn đề liên quan