2009-03-03 71 views

Trả lời

23

int = int + tăng gấp đôi là chủ yếu

int = đôi + đôi

và bạn không thể làm điều đó mà không cần đúc ...

Các int + = lực lượng tăng gấp đôi kết quả đến một int trong khi một cái khác đòi hỏi phải đúc.

Vì vậy, a = (int) (a + b);

nên biên dịch.

Edit: theo yêu cầu trong các ý kiến ​​... đây là một liên kết đến đọc hơn (không phải là đọc dễ dàng nhất, nhưng thông tin chính xác nhất): http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

+0

bạn có thể cung cấp một số liên kết để đọc thêm không? Cảm ơn – hhafez

+0

tôi nghĩ rằng "sâu" lý do là bởi vì nó không được phép gán trong khi thu hẹp: byte = int là không được phép và int = đôi quá. sẽ làm một byte đơn giản a; a + = 2; và không biên dịch được, mọi người sẽ ném giày vào java. nhưng tôi vẫn muốn có thêm quy tắc mà làm cho nó hoạt động mà không có diễn viên: ( –

+0

Tôi không chắc chắn có một lý do sâu sắc, nhưng đặc tả ngôn ngữ Java xác định rõ ràng các diễn viên tiềm ẩn: http://java.sun.com/ docs/books/jls/second_edition/html/expressions.doc.html # 5304 – DefLog

32

Trong Java + = điều hành có một diễn viên tiềm ẩn đến loại tay trái. Điều này đi cho tất cả các nhà khai thác sáng tác.

+1

Tôi nghĩ đây là câu trả lời ngắn gọn hơn –

4

đôi + int trả gấp đôi, vì vậy đôi = đôi + int là hợp pháp, xem JLS 5.1.2 Mở rộng nguyên thủy chuyển đổi mặt khác int = đôi + int là "Thu hẹp chuyển đổi nguyên thủy" và đòi hỏi diễn viên rõ ràng

0

Như mọi người đã nêu, dấu + = có một dàn diễn viên tiềm ẩn. Để giúp minh họa điều đó, tôi sẽ sử dụng một ứng dụng mà tôi đã viết trong khi đó là hoàn hảo cho các loại câu hỏi này. Đây là một bộ phận phân tách trực tuyến để bạn có thể kiểm tra bytecode thực tế đó là được sản xuất: http://javabytes.herokuapp.com/

Và một bảng ý nghĩa của chúng: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

Vì vậy, chúng ta hãy nhìn vào bytecode từ một số mã Java đơn giản:

int i = 5; 
long j = 8; 
i += j; 

Mã chưa được tháo rời. Nhận xét của tôi sẽ có // ở phía trước.

Code: 
     0: iconst_5 //load int 5 onto stack 
     1: istore_0 //store int value into variable 0 (we called it i) 
     2: ldc2_w #2; //long 8l 
        //load long 8 value onto stack. Note the long 8l above 
        //is not my comment but how the disassembled code displays 
        //the value long 8 being used with the ldc2_w instruction 
     5: lstore_1 //store long value into variable 1 (we called it j) 
     6: iload_0 //load int value from variable 0 
     7: i2l  //convert int into a long. At this point we have 5 long 
     8: lload_1 //load value from variable 1 
     9: ladd  //add the two values together. We are adding two longs 
        //so it's no problem 
     10: l2i  //THIS IS THE MAGIC. This converts the sum back to an int 
     11: istore_0 //store in variable 0 (we called it i) 
Các vấn đề liên quan