2012-02-07 29 views
8

bất cứ ai có thể giải thích điều này với tôi,Strange hành vi Java + = điều hành

String str = "Hello"; 

str += ((char)97) +2; // str = "Hello99"; 

str = str +((char)97)+2; // str = "Helloa2"; 

nào các nhà điều hành += đánh giá phía bên phải đầu tiên sau đó nó nối nó với phía bên trái?

Trả lời

11

Sự khác biệt phải làm với thứ tự hoạt động. Sau đây:

str += ((char)97) +2; 

tương đương với:

str = str + (((char)97) + 2); 

Mặt khác, sau đây:

str = str +((char)97)+2; 

tương đương với:

str = (str + ((char)97)) + 2; 

Lưu ý sự khác biệt trong vị trí của dấu ngoặc đơn.

Bây giờ chúng ta hãy xem xét hai trường hợp:

1) str = str + (((char)97) + 2):

Ở đây, 97 + 2 được đánh giá đầu tiên. Kết quả là int (99), được chuyển thành chuỗi và được thêm vào str. Kết quả là "Hello99".

2) str = (str + ((char)97)) + 2:

Ở đây, (char)97 ('a') được nối vào chuỗi, và sau đó 2 được chuyển thành chuỗi và nối vào kết quả. Điều này cho phép "Helloa2".

2

Đây là tất cả về tính tương tác của nhà điều hành.

str += ((char)97) +2; 

có dịch để:

str = str + (((char)97)+2); 
1

dòng đầu tiên của bạn là tương đương với:

str = str + ((char)97) + 2); 

trong khi thứ hai của bạn là tương đương với:

str = (str + ((char)97)) + 2 
1
str = str +((char)97)+2 

vì đầu tiên là chuỗi '+' nhà điều hành được sử dụng như chuỗi concat (giá trị khác được chuyển đổi thành chuỗi)

str +=((char)97)+2 

bên đầu tiên đúng được đánh giá đến 99 (hai byte tổng hợp) hơn là str + 99 -> chuỗi concat

5

Có. Các phần có liên quan của JLS là ở đây: http://java.sun.com/docs/books/jls/first_edition/html/15.doc.html#5304

Vào lúc chạy, khái niệm được đánh giá theo một trong hai cách.Nếu biểu thức toán hạng bên trái không phải là một biểu thức truy cập mảng, sau đó bốn bước được yêu cầu:

  • Thứ nhất, các toán hạng bên trái được đánh giá để sản xuất một biến. Nếu đánh giá này hoàn thành đột ngột, sau đó biểu thức gán hoàn thành đột ngột vì cùng một lý do; toán hạng bên phải không được đánh giá và không có phép gán nào xảy ra.
  • Nếu không, giá trị của toán hạng bên trái được lưu và sau đó là các toán hạng bên phải được đánh giá. Nếu đánh giá này hoàn thành đột ngột, sau đó biểu thức chuyển nhượng hoàn thành đột ngột cho cùng một lý do và không có chuyển nhượng nào xảy ra.
  • Nếu không, giá trị đã lưu của biến trái và giá trị của toán hạng bên phải được sử dụng để thực hiện các hoạt động nhị phân chỉ định bởi các hợp chất phân công điều hành. Nếu hoạt động này hoàn thành đột ngột (chỉ có khả năng là phân chia số nguyên bằng không xem §15.16.2), thì biểu thức gán hoàn thành đột ngột vì cùng một lý do và không xảy ra chuyển nhượng .
  • Nếu không, kết quả của phép toán nhị phân là được chuyển đổi thành loại biến bên trái và kết quả của chuyển đổi được lưu vào biến.

(Nhấn mạnh của tôi.)