Saltar al contenido

¿Operador lógico XOR en C ++?

Solución:

los != operador sirve este propósito para bool valores.

Para una verdadera operación lógica XOR, esto funcionará:

if(!A != !B) {
    // code here
}

Nota la ! están ahí para convertir los valores a booleanos y negarlos, de modo que dos enteros positivos desiguales (cada uno true) evaluaría a false.

Manual adecuado lógico La implementación de XOR depende de qué tan cerca desee imitar el comportamiento general de otros operadores lógicos (|| y &&) con su XOR. Hay dos cosas importantes sobre estos operadores: 1) garantizan la evaluación de cortocircuito, 2) introducen un punto de secuencia, 3) evalúan sus operandos solo una vez.

La evaluación XOR, como comprenderá, no se puede cortocircuitar ya que el resultado siempre depende de ambos operandos. Entonces 1 está fuera de discusión. Pero, ¿y 2? Si no le importa 2, entonces con normalizado (es decir bool) operador de valores != hace el trabajo de XOR en términos de resultado. Y los operandos se pueden normalizar fácilmente con unario !, si necesario. Por lo tanto !A != !B implementa el XOR adecuado en ese sentido.

Pero si te importa el punto de secuencia adicional, tampoco != ni bit a bit ^ es la forma correcta de implementar XOR. Una forma posible de hacer XOR (a, b) correctamente podría verse de la siguiente manera

a ? !b : b

En realidad, esto es lo más parecido a hacer un XOR casero “similar” a || y &&. Esto solo funcionará, por supuesto, si implementas tu XOR como una macro. Una función no sirve, ya que la secuenciación no se aplicará a los argumentos de la función.

Alguien podría decir, sin embargo, que la única razón de tener un punto de secuencia en cada && y || es para soportar la evaluación en cortocircuito y, por lo tanto, XOR no la necesita. En realidad, esto tiene sentido. Sin embargo, vale la pena considerar tener un XOR con un punto de secuencia en el medio. Por ejemplo, la siguiente expresión

++x > 1 && x < 5

tiene un comportamiento definido y un resultado específico en C / C ++ (con respecto a la secuenciación al menos). Por lo tanto, uno podría esperar razonablemente lo mismo de lo definido por el usuario. lógico XOR, como en

XOR(++x > 1, x < 5)

mientras que un !=XOR basado en no tiene esta propiedad.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *