Điều này được lấy cảm hứng trực tiếp từ this question.
Có rất nhiều tài liệu tham khảo/câu lệnh mà các toán tử bitwise, khi áp dụng cho các phép toán, sẽ không bị đoản mạch. Vì vậy, nói cách khác là boolean a = f() & g()
, trong đó f()
và g()
cả hai boolean trả về, cả hai sẽ luôn được đánh giá.
Tuy nhiên, JLS chỉ nói:Điều gì (trong các thông số kỹ thuật) đảm bảo rằng 'các nhà khai thác logic ngắn mạch không thực sự không phải là ngắn mạch?
15.22.2 Boolean Operators logic &, ^, và |
Khi cả hai toán hạng của &,^hoặc | toán tử có kiểu boolean hoặc Boolean, sau đó loại biểu thức toán tử bitwise là boolean. Trong mọi trường hợp, các toán hạng có thể chuyển đổi unboxing (§5.1.8) nếu cần.Đối với &, giá trị kết quả là đúng nếu cả hai giá trị toán hạng là đúng; nếu không, kết quả là sai.
Đối với ^, giá trị kết quả là đúng nếu giá trị toán hạng là khác nhau; nếu không, kết quả là sai.
Đối với |, giá trị kết quả là false nếu cả hai giá trị toán hạng là sai; nếu không, kết quả là đúng.
Làm cách nào để đảm bảo rằng cả hai toán hạng đều được đánh giá? Ngoài xor
, bạn vẫn có thể phá vỡ và trả về kết quả nếu một trong các đối số (và có thể là giây/phải là lần đầu tiên được đánh giá) vi phạm điều kiện.
Ví dụ: a & b
chỉ cần đánh giá b
là sai để đánh giá biểu thức thành sai.
Xin lưu ý: Tôi không hỏi nếu nó được thực hiện theo cách này (không ngắn mạch) -n chắc chắn là.
Tôi hỏi:
Would thực hiện nó với ngắn mạch vi phạm tiêu chuẩn ngôn ngữ ?
Có. Văn bản chuẩn nêu rõ các giá trị cho cả hai giá trị toán hạng, tức là cả hai biểu thức cần được loại bỏ. – rsp