2012-02-13 24 views
5

Đ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()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ữ ?

+0

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

Trả lời

4

Xem JLS 15.7.2 Evaluate Operands before Operation

Các ngôn ngữ lập trình Java cũng đảm bảo rằng tất cả các toán hạng của một nhà điều hành (trừ các nhà khai thác có điều kiện & &, ||, và? :) dường như được đánh giá đầy đủ trước khi bất kỳ một phần của hoạt động chính nó được thực hiện.

Vì vậy, nếu bạn có các nhà điều hành &, cả toán hạng cần phải được đánh giá trước kết quả cuối cùng được tính.

Ngoài ra, phần trước đó yêu cầu rõ ràng rằng toán hạng bên trái của bất kỳ toán tử nhị phân nào cần được đánh giá trước tiên.

+0

Bắt tốt! Cảm ơn! – wmz

+0

Đếm cho tôi ấn tượng với _finding_ phần này. –

1

JLS quy định rõ ràng rằng việc rút ngắn được thực hiện cho điều kiện hoặc hoặc có điều kiện và. Nó giải thích hành vi của điều kiện-hoặc/và về các bitwise-hoặc/và các toán tử. Vì vậy, nó nhấn mạnh rằng rút ngắn là một biến thể trong hành vi từ các toán tử bitwise.

Vì vậy, tôi sẽ nói rằng việc sử dụng shortcutting sẽ vi phạm tiêu chuẩn. Nó chắc chắn sẽ vi phạm kỳ vọng của các nhà phát triển.

15.24 Điều kiện hoặc điều hành ||

Nhà điều hành & & là như & (§15.22.2), nhưng đánh giá toán hạng bên phải của nó chỉ khi giá trị của toán hạng bên trái của nó là sự thật.