Piensa en booleanos, no en pedacitos
En resumen, la solución de tu profesor es mejor (pero sigue siendo incorrecta, estrictamente hablando, ver más abajo) porque usa operadores booleanos en lugar de operadores bit a bit y trata los booleanos como enteros. La expresión c==1
para representar "c es verdadero" es incorrecta porque si c puede ser un número (de acuerdo con la asignación establecida), cualquier valor distinto de cero de c se considerará como representativo true
.
Vea esta pregunta sobre por qué es mejor no comparar booleanos con 0 o 1, incluso cuando es seguro hacerlo.
Una muy buena razón para no usar xor
es que esta es la operación u exclusiva exclusiva en bits . Resulta que funciona en su ejemplo porque tanto el lado izquierdo como el derecho son expresiones booleanas que se convierten a 1 o 0 (ver de nuevo 1 ).
El booleano exclusivo-o es de hecho !=
.
Desglosando la expresión
Para comprender mejor la solución de su profesor, es más fácil reemplazar los operadores booleanos con sus equivalentes de "token alternativo", lo que lo convierte en un código C ++ mejor redable (imho) y completamente equivalente: ¡usando 'not' for '!' y 'y' para '&&' obtienes
(not a and not b) != c
Desafortunadamente, no hay exclusive_or
otro operador lógico not_eq
que no sea útil en este caso.
Si desglosamos la expresión del lenguaje natural:
O a y b son falsos o c es verdadero, pero no ambos.
primero en una oración sobre proposiciones booleanas A y B:
A o B, pero no ambos.
esto se traduce en A != B
(solo para booleanos, no para ningún tipo A y B).
Entonces la proposición A era
ayb son falsos
que se puede indicar como
a es falso y b es falso
que se traduce (not a and not b)
y finalmente
c es cierto
Lo que simplemente se traduce en c
. Combinándolos obtienes de nuevo (not a and not b) != c
.
Para una explicación más detallada de cómo funciona esta expresión, me remito a las tablas de verdad que otros han dado en sus respuestas.
Ambos están equivocados
Y si puedo señalar: la asignación original declaró que a, byc pueden ser números no negativos, pero no indicó inequívocamente que si fueran números, deberían limitarse a los valores 0 y 1. Si hay algún número que sea no 0 representa true
, como es habitual, entonces el siguiente código arrojaría una respuesta sorprendente :
auto c = 2; // "true" in some way
auto a = 0; // "false"
auto b = 0; // "false"
std::cout << ((!a && !b) != c);
// this will output: 1 (!)
// fix by making sure that != compares booleans:
std::cout << ((!a && !b) != (bool)c);
a == b or c
lugar dea == b or a ==c
. El problema es que lanuage hablado es imprecisa y, de hecho ambas interpretaciones podría ser válido