2013-03-31 34 views
7

tôi đã chạy vào dòng đáng ngạc nhiên sau đây:Java int + = đôi cú pháp ngạc nhiên

int x = 7; 
x += 0.5; 

là cú pháp rõ ràng quy phạm pháp luật! Sau khi bổ sung, x vẫn là 7, do đó, gấp đôi đang được đúc thành một int và làm tròn xuống 0, nhưng điều này được thực hiện mà không có bất kỳ diễn xuất rõ ràng nào trong mã. Có ai ngạc nhiên bởi điều này không? Lý do cơ bản ở đây là gì?

chỉnh sửa để làm rõ câu hỏi của tôi: Có ai có thể đưa ra lý do chính đáng cho quyết định này không? Nó đánh tôi như một quyết định khủng khiếp để đòi hỏi phải đúc rõ ràng ở khắp mọi nơi khác, nhưng có một điểm này trong ngôn ngữ mà bạn âm thầm vứt bỏ dữ liệu. Tui bỏ lỡ điều gì vậy?

+0

Thú vị. Tôi chắc chắn rằng [JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/index.html) địa chỉ này mặc dù. Bạn đã cho nó một cái nhìn để xem những gì nó nói? –

+0

@Hovercraft: JLS cung cấp thông số kỹ thuật, nhưng không phải là biện minh cho quyết định, đó là những gì tôi hỏi. –

Trả lời

12
x += 0.5; 

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

x = (int) (x + 0.5) 

Nói chung:

x += y tương đương với x = (type of x) (x + y)


Xem 15.26.2. Compound Assignment Operators

+0

Tôi hiểu điều này. Điều làm tôi ngạc nhiên là trình biên dịch cho phép nó! Trong dòng thứ 2 của bạn, có một diễn viên rõ ràng, buộc các lập trình viên phải nhận ra rằng họ có thể mất một số thông tin. Ví dụ, x = x + .5 không biên dịch, nhưng x + = .5 thì ... lạ, phải không? –

+0

@EricLindauer không lạ chút nào, 'x + 0,5' cho kết quả gấp đôi, trong khi' (int) (x + 0.5) 'là một số nguyên. –

+2

Tôi đoán tôi không rõ ràng ... Tôi hiểu rằng spec nói rằng đây là cách nó hoạt động. Câu hỏi của tôi là: TẠI SAO ?? Làm thế nào có thể bất cứ ai biện minh cho phép x + = .5, nhưng không cho phép x = x + .5 ?! Điều đó có vẻ điên rồ với tôi. –

0

x += 0.5; giống với x = (int) (x + 0.5);.

0

Điều này là do toán tử gán ghép đặt một diễn viên tiềm ẩn (tự động cast): Vì vậy

x+=0.5 => x =(int)(x + 0.5) => x = (int)(7.5) => x = 7 
+0

Có lý do chính đáng để làm điều đó không? –

+1

@EricLindauer: Nếu 'x' là một' short', ngay cả khi 'y' là tốt, một câu lệnh như' x = x + y; 'sẽ là bất hợp pháp mà không có một kiểu chữ rõ ràng. Do đó, Java hoạt động như thể kết quả tính toán bởi bất kỳ toán tử gán-số học nào được định kiểu rõ ràng cho kiểu kết quả, cho dù nó có hợp lý trong bất kỳ trường hợp cụ thể nào không. – supercat

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