Vì vậy, các nhà khai thác nhị phân trên dữ liệu boolean, Java có &
, |
, ^
, &&
và ||
.
Hãy tóm tắt ngắn gọn những gì họ làm ở đây:
- JLS 15.22.2 Toán tử lôgic Boolean &, ^, và |
- JLS 15.23 Toán tử và Điều kiện &&
- JLS 15.24 Toán tử hoặc có điều kiện ||
Đối với
&
, giá trị kết quả làtrue
nếu cả hai giá trị toán hạng làtrue
; nếu không, kết quả làfalse
.Đối với
|
, giá trị kết quả làfalse
nếu cả hai giá trị toán hạng làfalse
; nếu không, kết quả làtrue
.Đối với
^
, giá trị kết quả làtrue
nếu các giá trị toán hạng khác nhau; nếu không, kết quả làfalse
.Các
&&
nhà điều hành cũng giống như&
nhưng đánh giá bên tay phải của nó toán hạng chỉ nếu giá trị của trái tay của toán hạng làtrue
.Các
||
nhà điều hành cũng giống như|
, nhưng đánh giá bên tay phải của nó toán hạng chỉ nếu giá trị của trái tay của toán hạng làfalse
.
Bây giờ, trong số tất cả 5, 3 trong số những người có các phiên bản chuyển nhượng hợp chất, cụ thể là |=
, &=
và ^=
. Vì vậy, câu hỏi của tôi là hiển nhiên: tại sao Java không cung cấp &&=
và ||=
cũng như vậy? Tôi thấy rằng tôi cần những thứ đó nhiều hơn những gì tôi cần &=
và |=
.
Và tôi không nghĩ rằng "bởi vì nó quá dài" là một câu trả lời tốt, bởi vì Java có >>>=
. Phải có một lý do tốt hơn cho sự thiếu sót này.
Từ 15,26 Người điều hành nhiệm vụ :
Có 12 toán tử gán; [...]
= *= /= %= += -= <<= >>= >>>= &= ^= |=
Một nhận xét đã được đưa ra rằng nếu &&=
và ||=
được thực hiện, thì đó sẽ là các toán tử duy nhất không đánh giá phía bên phải trước. Tôi tin rằng khái niệm rằng một toán tử gán ghép đánh giá phía bên phải trước tiên là một sai lầm.
Từ 15.26.2 Các nhà khai thác chuyển nhượng hợp chất :
Biểu thức gán ghép có dạng
E1 op= E2
tương đương vớiE1 = (T)((E1) op (E2))
, đâuT
là kiểuE1
, ngoại trừ biểu thức chỉE1
được đánh giá một lần.
Để chứng minh, đoạn mã sau ném một NullPointerException
, không phải một ArrayIndexOutOfBoundsException
.
int[] a = null;
int[] b = {};
a[0] += b[-1];