Zuordnung:
Übersetzen Sie die folgenden Ausdrücke in natürlicher Sprache in C ++ - Ausdrücke. Angenommen, alle Variablen sind nicht negative Zahlen oder Boolesche Werte (mit dem Wert true oder false).
Natürliche Sprache:
Entweder a und b sind beide falsch oder c ist wahr, aber nicht beide.
Meine Lösung:
(a==0 && b==0)xor(c==1)
Professorenlösung:
(!a && !b) != c
Fragen:
Ich denke, ich verstehe die erste Klammer ein wenig, indem ich "nicht-a" und "nicht-b" sage. Ich denke, dass a und b dann falsch sein müssen, vorausgesetzt, ab wird am Anfang als ungleich Null angenommen. Recht?
Aber was ist mit dem Teil, der "ungleich c" sagt?
Ich verstehe die Professors-Lösung nicht. Kann jemand sie für mich aufschlüsseln?
Danke für die Hilfe!
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önntenAntworten:
Ich gehe davon aus, dass
a
,b
undc
sindbool
.Lassen Sie uns einige Wahrheitstabellen zeichnen:
Wie Sie sehen können,
a
unda==1
sind gleichwertig und!a
unda==0
sind auch gleich, so können wir umschreiben(a==0 && b==0)xor(c==1)
als(!a && !b) xor c
.Nun noch ein paar Wahrheitstabellen:
So
a!=b
entsprichta xor b
, so schreiben wir können(!a && !b) xor c
zu(!a && !b)!=c
. Wie Sie sehen, sind Ihre Lösungen völlig gleichwertig, nur mit unterschiedlichen "Zeichen" geschrieben.UPD : Vergessen zu erwähnen. Es gibt Gründe, warum die Lösung des Professors genau so aussieht.
Die Lösung des Professors ist idiomatischer. Ihre Lösung ist zwar technisch korrekt, aber kein idiomatischer C ++ - Code.
Das erste kleine Problem ist die Verwendung von Typen. Ihre Lösung basiert auf der Konvertierung zwischen
int
undbool
beim Vergleichen des Booleschen Werts mit einer Zahl oder Verwendungxor
. Dies ist ein "bitweiser Exklusiv" - oder "Operator", der auch aufint
s einwirkt . In einem modernen C ++ wird es viel mehr geschätzt, Werte vom richtigen Typ zu verwenden und sich nicht auf solche Konvertierungen zu verlassen, da diese manchmal nicht so klar und schwer zu begründen sind. Fürbool
solche Werte sindtrue
undfalse
statt1
und0
sind. Auch!=
ist besser geeignet, alsxor
weil technischbool
s als Zahlen gespeichert sind, aber sematisch haben Sie keine Zahlen, nur logische Werte.In der zweiten Ausgabe geht es auch um Redewendung. Es liegt hier :
a == 0
. Es wird nicht als bewährte Methode angesehen, boolesche Ausdrücke mit booleschen Konstanten zu vergleichen. Wie Sie bereits wissen,a == true
ist völlig gleichbedeutend mit gerechta
unda == false
ist gerecht!a
odernot a
(ich bevorzuge letzteres). Um den Grund zu verstehen, warum dieser Vergleich nicht gut ist, vergleichen Sie einfach zwei Codefragmente und entscheiden Sie, was klarer ist:vs.
quelle
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 anzusehentrue
.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
Leider gibt es keinen
exclusive_or
anderen logischen Operator alsnot_eq
, was in diesem Fall nicht hilfreich ist.Wenn wir den Ausdruck der natürlichen Sprache auflösen:
zuerst in einen Satz über die Booleschen Sätze A und B:
Dies bedeutet
A != B
(nur für Boolesche Werte, nicht für Typ A und B).Dann war Satz A.
was als angegeben werden kann
was übersetzt in
(not a and not b)
und schließlichWas 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 :quelle
a
,b
undc
deklariert alsbool
, in diesem Fallc == 1
ist richtig , obwohl atrocious Code. Jedenfalls ist dies die Antwort, die ich geschrieben hätte: Der Code von OP entspricht möglicherweise dem des Professors, aber es ist schlechtes C ++.variables are non-negative numbers or boolean
. Also +1 an @dhavenith von mir, weil ich ein Detail gefunden habe, das die meisten anderen hier übersehen haben (einschließlich mir anfangs).Ich werde versuchen, mit einigen weiteren Worten zu erklären: Zahlen können implizit in boolesche Werte konvertiert werden:
Quelle auf cppreference
Dies führt zu folgenden Schlussfolgerungen:
a == 0
ist das gleiche wie!a
, weila
in einen Booleschen Wert konvertiert und dann invertiert wird, was gleich ist!(a != 0)
. Gleiches gilt für b.c==1
wird nur wahr, wennc
gleich 1. Die Verwendung der Konvertierung(bool)c
würde ergeben,true
wennc != 0
nicht nur wennc == 1
. So kann es funktionieren, weil man normalerweise den Wert 1 verwendet, um darzustellentrue
, aber es ist nicht garantiert.a != b
ist dasselbe wiea xor b
whena
undb
ar boolesche Ausdrücke. Es ist wahr, wenn der eine oder andere Wert wahr ist, aber nicht beide. In diesem Fall ist die linke Seite(a==0 && b==0)
boolesch, daher wird auch die rechte Seitec
in einen Booleschen Wert konvertiert. Daher werden beide Seiten als boolesche Ausdrücke interpretiert und sind somit!=
dieselben wiexor
in diesem Fall.Sie können dies alles selbst anhand der Wahrheitstabellen überprüfen, die in den anderen Antworten angegeben sind.
quelle
Wie wir aus den Wahrheitstabellen sehen können:
!
(not
) und==0
geben die gleichen Ergebnisse.!=
undxor
geben die gleichen Ergebnisse.c==1
ist das gleiche wie geradec
So zeigt einer unter dem anderen, warum diese beiden Ausdrücke das gleiche Ergebnis liefern:
Wahrheitstabellen:
Nicht
== 0
== 1
Und
Nicht gleich
XOR
quelle