2009-11-02 35 views
16

Các quy tắc cho quảng cáo là "khi các toán hạng có các loại khác nhau, quảng cáo số nhị phân tự động xảy ra với loại toán hạng nhỏ hơn được chuyển đổi thành lớn hơn". Nhưng các toán hạng có cùng loại, ví dụ:Quảng cáo bằng Java?

byte=byte+byte // Compile time error... found int.. 

Vậy tại sao lại như vậy?

+0

có thể trùng lặp của [Tại sao tôi không thể thêm hai byte và nhận được một int và tôi có thể thêm hai byte cuối cùng nhận được một byte?] (http://stackoverflow.com/questions/13100019/why-can-not-i-add-two-bytes-and-get-an-int-and-i-can- add-two-final-bytes-get-ab) –

Trả lời

35

Không có toán tử + nào cho byte. Thay vào đó, cả hai toán hạng được thăng int, vì vậy bạn đã có

byte = byte + byte 
... becomes (widening to find + operator) ... 
byte = int + int 
... becomes (result of + operator) ... 
byte = int 

... mà sau đó thất bại vì không có chuyển đổi ngầm từ int để byte. Bạn cần phải cast:

byte a = 1; 
byte b = 2; 

byte c = (byte) (a + b); 

Sau đây là các thực tế quy tắc để quảng bá số, từ section 5.6.2 of the JLS:


Khi một nhà điều hành áp dụng chương trình khuyến mãi số nhị phân sang một cặp toán hạng, mỗi trong số đó phải biểu thị một giá trị có thể chuyển đổi thành loại số, các quy tắc sau áp dụng theo thứ tự, sử dụng chuyển đổi mở rộng (§5.1.2) để chuyển đổi toán hạng khi cần:

  • Nếu bất kỳ toán hạng nào thuộc loại tham chiếu, chuyển đổi unboxing (§5.1.8) được thực hiện. Sau đó:
  • Nếu một trong hai toán hạng là loại gấp đôi thì toán tử còn lại được chuyển đổi thành gấp đôi.
  • Nếu không, nếu toán hạng là loại phao, thì toán tử còn lại được chuyển thành phao.
  • Nếu không, nếu toán hạng là loại dài, cột kia được chuyển đổi thành dài.
  • Nếu không, cả hai toán hạng sẽ được chuyển thành loại int.
+4

cảm ơn Jon đây là những gì tôi mong đợi. Nhưng một điều tôi phải hỏi là, Tại sao không có toán tử + cho byte? – i2ijeya

14

Bạn được cung cấp câu trả lời đúng về quảng cáo tự động cho 'int'.

Có một lưu ý nữa về toán tử gán ký tự đó hoạt động như chúng có trường hợp loại ẩn. Ví dụ:

byte b1 = 1; 
byte b2 = 2; 
b1 = b1 + b2; // compilation fails 
b1 += b2; // compilation successful 
0

Từ this SO question, và câu trả lời ở trên do + toán tử số học, cả hai toán hạng được chuyển đổi sang loại int.

byte b1 = 1; 
byte b2 = 2; 
byte b3 = b1 + b2; // compile time error 

Trong đoạn mã trên, giá trị của b1b2 sẽ được giải quyết trong thời gian chạy, vì vậy trình biên dịch sẽ chuyển đổi tất cả để int trước khi giải quyết các giá trị.

Nhưng nếu chúng ta xem xét đoạn mã sau,

final byte b1 = 1; 
final byte b2 = 2; 
int b3 = b1 + b2; // constant expression, value resolved at compile time 

b1b2 là các biến thức và giá trị này sẽ được giải quyết tại thời gian biên dịch để biên soạn sẽ không thất bại.

0

Tôi muốn nói về Xúc tiến nói chung

Java có thể đánh giá biểu thức chỉ số học trong đó các loại của các toán hạng là giống hệt nhau

Ví dụ, trong một biểu thức chứa int và đôi giá trị , các giá trị int được tăng lên gấp đôi giá trị để sử dụng trong biểu thức.

trong một từ khác

double someVar = 1/2;// someVar = 0 

nhưng

double someVar = (double)1/2;// someVar = 0.5 

tại sao?

  • chúng tôi sử dụng (double) cast operator để tạo ra một bản sao temporary dấu chấm động của toán hạng của nó "1" (nó được gọi là explicit conversion)
  • Việc tính toán hiện nay bao gồm một giá trị dấu chấm động (bản sao đôi tạm thời 1) chia cho số nguyên 2
  • theo tuyên bố trên, Java thực hiện một hoạt động gọi là promotion (hoặc chuyển đổi ngầm), vì vậy int values được thăng double values để sử dụng in biểu thức => số nguyên 2 được đề bạt lên gấp đôi
  • biểu thức trở thành double someVar = 1.0/2.0; // someVar= 0.5

niềm hy vọng này là hữu ích, ngay cả khi nó được ra khỏi cốt lõi của câu hỏi

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