Dies ist der einzige Ort , den ich je gesehen habe and
, or
und not
als tatsächliche Operatoren in C ++ aufgeführt. Als ich ein Testprogramm in NetBeans schrieb, bekam ich die rote Unterstreichung, als ob es einen Syntaxfehler gäbe, und stellte fest, dass die Website falsch war, aber es ist NetBeans, das falsch ist, weil es wie erwartet kompiliert und ausgeführt wurde.
Ich kann sehen, !
dass ich bevorzugt werde, not
aber die Lesbarkeit von and
&& or
scheint größer zu sein als die ihrer grammatikalischen Brüder. Warum existieren diese Versionen der logischen Operatoren und warum verwendet sie scheinbar niemand? Ist dies wirklich gültiges C ++ oder eine Art Kompatibilität mit C, die in der Sprache enthalten war?
c++
language-features
logical-operators
defektiv
quelle
quelle
||
und&&
vielleicht sogar!
manchmal abzuschaffen . Wörter sind immer besser als "Zeilenrauschen", ganz zu schweigen von der möglichen Verwechslung mit den Bitmanipulationsoperatoren.and
ist besser lesbar und dann "and
&&or
" zu schreiben :)Antworten:
Sie haben ihren Ursprung in C in der Kopfzeile
<iso646.h>
. Zu der Zeit gab es Tastaturen , die nicht die gewünschten Symbole für Typen könnte&&
(zum Beispiel), so dass der Header enthalten#define
ist , dass sie so durch (in unserem Beispiel) unterstützen würde definieren , dabeiand
zu sein&&
. Natürlich wurde dies mit der Zeit weniger genutzt.In C ++ wurden sie zu sogenannten alternativen Token . Sie nicht etwas brauchen enthalten diese Token in einem konformen Compiler zu verwenden (als solche, die C ++ - ified Version des C - Header
<ciso646>
ist leer). Alternative Token sind mit Ausnahme der Rechtschreibung wie normale Token. Während des Parsensand
ist es genau das Gleiche wie&&
, es ist nur eine andere Art, dasselbe zu buchstabieren.Was ihre Verwendung betrifft: Da sie selten verwendet werden, ist ihre Verwendung oft überraschender und verwirrender als hilfreich. Ich bin sicher, wenn es normal wäre, wären sie viel einfacher zu lesen, aber die Leute sind so daran gewöhnt
&&
und||
alles andere lenkt nur ab.EDIT: Ich habe eine sehr leichte Zunahme ihrer Nutzung gesehen, seit ich dies gepostet habe. Ich vermeide sie immer noch.
quelle
or
odernot
ohne den Header nicht.Sie existieren aus Gründen der Benutzerfreundlichkeit (Zeichenunterstützung in Tastatur- / Anzeigevarianten) und der allgemeinen Lesbarkeit, aber es gibt noch einen anderen Grund, der heutzutage ausgeprägter ist. Fast keine der Antworten hier , hier oder auch nur die Hauptantwort hierFormulieren Sie den Hauptgrund, warum viele von uns die Wortversionen den Symbolversionen vorziehen (und einen Hauptgrund, warum andere Sprachen sie verwenden): Fehler. Die Unterschiede zwischen den Wortversionen sind sehr sichtbar. Die Unterschiede zwischen den Symbolversionen sind deutlich geringer, so dass Fehler in vergleichsweise viel größerem Maße in Versuchung geführt werden: "x | y" ist sehr viel nicht "x || y", aber wenn es in einen größeren Ausdruck eingebettet ist, sind viele von uns vermisse den Unterschied. Es ähnelt dem häufigen versehentlichen Mischen der Zuordnung mit dem Gleichheitsoperator. Aus diesem Grund habe ich mich von den Symbolversionen (es war nicht einfach) zugunsten der Wortversionen entwöhnt. Ich möchte lieber, dass jemand sie wegen unserer Liebe zu alten Dingen doppelt betrachtet, als Fehler zu versuchen.
quelle
/Za
) festlegen , um die alternativen Schlüsselwörter zu unterstützen (siehe stackoverflow.com/a/555524/368896 ). Das hat vermutlich auch andere Auswirkungen. In Visual Studio ist es daher nicht unbedingt sicher, diesen Rat zu befolgen.x | y
sich visuell ausreichend (in monospaced Schriftarten) vonx || y
, aber ich finde das!
in z. B.if (!f(xyz) && ...
leichter zu übersehen alsif (not f(xyz) && ...
.and
,or
undnot
in einem Booleschen Ausdruck, tatsächlich verbessern die Lesbarkeit und es hebt die Unterscheidung Bit Manipulationen. Daher sollten wirand
undor
Voreingenommenheit das Denken der Menschen, wie sie funktionieren sollte? ZBif (a == b or c)
stattif (a == b || a == c)
- so etwas taucht hier bei StackOverflow fast jeden Tag auf. Abstrakte Symbole, die nicht mit der englischen Sprache verbunden sind, reduzieren diese Fehler.In C ++ sind sie echte Schlüsselwörter. In C sind sie Makros definiert in
<iso646.h>
. Siehe http://web.archive.org/web/20120123073126/http://www.dinkumware.com/manuals/?manual=compleat&page=iso646.html .quelle
and
und&&
sind in C ++ funktional gleich. Die Operatorenand
undor
sind wirklich gültiges C ++ und Teil des Sprachstandards.Um dies näher auszuführen auf anderen Antworten mit einem konkreten Beispiel, es ist ein weiterer Grund neben nur „Lesbarkeit“ bevorzugen
and
über&&
. Wenn Sie "und" explizit buchstabieren, wenn Sie ein logisches UND meinen, ist die Möglichkeit subtiler Fehler ausgeschlossen.Bedenken Sie:
Alle drei if-Anweisungen werden kompiliert, aber die letzte bedeutet etwas ganz anderes und unbeabsichtigtes!
Wenn Sie immer verwenden,
and
wenn Sie logisches UND meinen, können Sie niemals versehentlich ein einzelnes "&" eingeben und Ihren Code erfolgreich kompilieren und mit mysteriösen Ergebnissen ausführen lassen.Eine weitere gute Übung: Versuchen Sie, versehentlich ein Zeichen von "und" wegzulassen, und sehen Sie, was passiert. ;)
quelle
and
und&&
funktional identisch" hinzufügen ... Und wenn Sie meine Antwort lesen, werden Sie sehen, dass ich sage, dass es NICHT um Lesbarkeit geht;)