Việc triển khai XOR logic thủ công đúng cách phụ thuộc vào mức độ bạn muốn bắt chước hành vi chung của các toán tử logic khác ( ||
và &&
) với XOR của bạn. Có hai điều quan trọng về các toán tử này: 1) chúng đảm bảo đánh giá ngắn mạch, 2) chúng giới thiệu một điểm thứ tự, 3) chúng chỉ đánh giá toán hạng của chúng một lần.
Đánh giá XOR, như bạn hiểu, không thể được ngắn mạch vì kết quả luôn phụ thuộc vào cả hai toán hạng. Vì vậy, 1 là ra khỏi câu hỏi. Nhưng còn 2 thì sao? Nếu bạn không quan tâm đến 2, thì với bool
toán tử giá trị chuẩn hóa (nghĩa là ) !=
thực hiện công việc của XOR về mặt kết quả. Và các toán hạng có thể dễ dàng được chuẩn hóa với unary !
, nếu cần thiết. Do đó !A != !B
thực hiện XOR thích hợp trong vấn đề đó.
Nhưng nếu bạn quan tâm đến điểm chuỗi bổ sung, thì cũng không !=
phải ^
là cách thích hợp để thực hiện XOR. Một cách có thể để làm XOR (a, b) chính xác có thể trông như sau
a ? !b : b
Điều này thực sự gần đến mức bạn có thể tạo ra một XOR tự chế "tương tự" ||
và &&
. Tất nhiên, điều này sẽ chỉ hoạt động nếu bạn triển khai XOR dưới dạng macro. Một hàm sẽ không được thực hiện, vì trình tự sẽ không áp dụng cho các đối số của hàm.
Tuy nhiên, ai đó có thể nói rằng lý do duy nhất để có một điểm thứ tự ở mỗi điểm &&
và ||
là để hỗ trợ đánh giá ngắn mạch, và do đó XOR không cần một điểm. Điều này có ý nghĩa, thực sự. Tuy nhiên, đáng để xem xét có một XOR với một điểm thứ tự ở giữa. Ví dụ: biểu thức sau
++x > 1 && x < 5
đã xác định hành vi và kết quả cụ thể trong C / C ++ (ít nhất là liên quan đến giải trình tự). Vì vậy, người ta có thể mong đợi một cách hợp lý điều tương tự từ XOR logic do người dùng định nghĩa , như trong
XOR(++x > 1, x < 5)
trong khi !=
XOR dựa trên cơ sở không có thuộc tính này.