Implementasi XOR logis manual yang tepat tergantung pada seberapa dekat Anda ingin meniru perilaku umum operator logis lainnya ( ||
dan &&
) dengan XOR Anda. Ada dua hal penting tentang operator ini: 1) mereka menjamin evaluasi hubung singkat, 2) mereka memperkenalkan titik urutan, 3) mereka mengevaluasi operan mereka hanya sekali.
Evaluasi XOR, seperti yang Anda mengerti, tidak dapat dihubung pendek karena hasilnya selalu tergantung pada kedua operan. Jadi saya tidak mungkin. Tapi bagaimana dengan 2? Jika Anda tidak peduli dengan 2, maka dengan bool
operator nilai yang dinormalisasi (yaitu ) !=
melakukan pekerjaan XOR dalam hal hasil. Dan operan dapat dengan mudah dinormalisasi dengan unary !
, jika perlu. Dengan demikian !A != !B
mengimplementasikan XOR yang tepat dalam hal itu.
Tetapi jika Anda peduli dengan titik sekuens tambahan, baik !=
bitwise atau tidak ^
adalah cara yang tepat untuk menerapkan XOR. Salah satu cara yang mungkin untuk melakukan XOR (a, b) dengan benar mungkin terlihat sebagai berikut
a ? !b : b
Ini sebenarnya sedekat yang Anda bisa untuk membuat XOR buatan sendiri "mirip" dengan ||
dan &&
. Ini hanya akan berfungsi, tentu saja, jika Anda menerapkan XOR Anda sebagai makro. Fungsi tidak akan berfungsi, karena pengurutan tidak akan berlaku untuk argumen fungsi.
Seseorang mungkin mengatakan, bahwa satu-satunya alasan memiliki titik urutan pada masing &&
- masing dan ||
untuk mendukung evaluasi hubung singkat, dan dengan demikian XOR tidak memerlukannya. Ini masuk akal, sebenarnya. Namun, ada baiknya mempertimbangkan memiliki XOR dengan titik urutan di tengah. Misalnya, ungkapan berikut
++x > 1 && x < 5
telah mendefinisikan perilaku dan hasil khusus dalam C / C ++ (berkaitan dengan sekuensing setidaknya). Jadi, orang mungkin mengharapkan hal yang sama dari XOR logis yang ditentukan pengguna , seperti pada
XOR(++x > 1, x < 5)
sementara !=
XOR yang berbasis tidak memiliki properti ini.