Denken Sie an Boolesche Werte, nicht an Bits
Zusammenfassend ist die Lösung Ihres Professors besser (aber genau genommen immer noch falsch, siehe weiter unten), da sie boolesche Operatoren anstelle von bitweisen Operatoren verwendet und Boolesche Werte als Ganzzahlen behandelt. Der Ausdruck c==1
für "c ist wahr" ist falsch, denn wenn c eine Zahl sein kann (gemäß der angegebenen Zuordnung), ist jeder Wert ungleich Null von c als repräsentativ anzusehen true
.
In dieser Frage erfahren Sie, warum es besser ist, Boolesche Werte nicht mit 0 oder 1 zu vergleichen, auch wenn dies sicher ist.
Ein sehr guter Grund, nicht zu verwenden, xor
ist, dass dies die bitweise Exklusivität oder Operation ist. In Ihrem Beispiel funktioniert dies zufällig, da sowohl die linke als auch die rechte Seite boolesche Ausdrücke sind, die in 1 oder 0 konvertiert werden (siehe erneut 1 ).
Das boolesche Exklusiv-Oder ist in der Tat !=
.
Den Ausdruck aufschlüsseln
Um die Lösung Ihres Professors besser zu verstehen, ist es am einfachsten, die booleschen Operatoren durch ihre "alternativen Token" -Äquivalente zu ersetzen, wodurch sie in besser redigierbaren (imho) und vollständig äquivalenten C ++ - Code umgewandelt werden: Verwenden von 'not' for '!' und 'und' für '&&' bekommen Sie
(not a and not b) != c
Leider gibt es keinen exclusive_or
anderen logischen Operator als not_eq
, was in diesem Fall nicht hilfreich ist.
Wenn wir den Ausdruck der natürlichen Sprache auflösen:
Entweder a und b sind beide falsch oder c ist wahr, aber nicht beide.
zuerst in einen Satz über die Booleschen Sätze A und B:
Entweder A oder B, aber nicht beide.
Dies bedeutet A != B
(nur für Boolesche Werte, nicht für Typ A und B).
Dann war Satz A.
a und b sind beide falsch
was als angegeben werden kann
a ist falsch und b ist falsch
was übersetzt in (not a and not b)
und schließlich
c ist wahr
Was einfach übersetzt bedeutet c
. Wenn du sie kombinierst, bekommst du wieder (not a and not b) != c
.
Zur weiteren Erklärung, wie dieser Ausdruck dann funktioniert, verweise ich auf die Wahrheitstabellen, die andere in ihren Antworten angegeben haben.
Sie sind beide falsch
Und wenn ich nicht picken darf: Die ursprüngliche Zuordnung besagte, dass a, b und c nicht negative Zahlen sein können, gab aber nicht eindeutig an, dass sie, wenn sie Zahlen wären, auf die Werte 0 und 1 beschränkt werden sollten Nicht 0 bedeutet true
, wie üblich, dann würde der folgende Code eine überraschende Antwort liefern :
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
statt zu übersetzena == b or a ==c
. Das Problem ist, dass die gesprochene Sprache ungenau ist und tatsächlich beide Interpretationen gültig sein könnten