Die geschriebenen Versionen der logischen Operatoren


93

Dies ist der einzige Ort , den ich je gesehen habe and, orund notals 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, notaber die Lesbarkeit von and&& orscheint 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?


4
\ me Schreibt seinen gesamten Code neu
Limited Atonement

2
Im Geiste des "sauberen Codes" würde ich persönlich empfehlen, die Gewohnheit des Schreibens ||und &&vielleicht sogar !manchmal abzuschaffen . Wörter sind immer besser als "Zeilenrauschen", ganz zu schweigen von der möglichen Verwechslung mit den Bitmanipulationsoperatoren.
Ichthyo

2
@Ichthyo Das ist nicht immer richtig. Es ist viel schneller, viele Symbole zu lesen und deren Bedeutung zu kennen, als viele Wörter zu lesen.
Vallentin

Was für einen menschlichen Leser klarer ist, hängt von der "Gestalt" ab. Manchmal kann ein Symbol klarer sein als ein durcheinandergebrachter Begriff, in diesem Fall jedoch nicht. Und einfache Wörter der englischen Sprache sind viel universeller als einige seltsame spezielle Symbole einer etwas seltsamen Programmiersprache ...
Ichthyo

3
Die Ironie, das zu sagen, andist besser lesbar und dann " and&& or" zu schreiben :)
Ivan Vergiliev

Antworten:


111

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 #defineist , dass sie so durch (in unserem Beispiel) unterstützen würde definieren , dabei andzu 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 Parsens andist 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.


Ist die Interpretation dieser alternativen Token also nur eine Compiler-Funktion oder steht sie in der C ++ - Spezifikation?
defectivehalt

2
@ Kavon: Es ist in Abschnitt 2.5 des Standards angegeben; Es ist eine Sprachfunktion.
GManNickG

15
Ich persönlich denke, sie sind viel besser ... aber dann bin ich Python voreingenommen. Ich weiß nicht, warum manche Leute sagen, wenn es nicht verstümmelt ist, ist es kein Code ...
Matthieu M.

Also sind diese in C nicht gültig, ohne diese Header-Datei einzuschließen? Ich bin überrascht, dass diese nicht von jedem benutzt werden; Sie machen Python so viel lesbarer.
Endolith

1
Zumindest Visual Studio 2015 CTP 6 mochte meine oroder notohne den Header nicht.
usr1234567

18

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.


4
Leider müssen Sie in Visual Studio (ab VS2013) eine bestimmte Compileroption ( /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.
Dan Nissenbaum

FWIW / -, wenn ich Leerzeichen um Operatoren setze, unterscheidet x | ysich visuell ausreichend (in monospaced Schriftarten) von x || y, aber ich finde das !in z. B. if (!f(xyz) && ...leichter zu übersehen als if (not f(xyz) && ....
Tony Delroy

@Tony D Wenn Sie Leerzeichen um Operatoren setzen, ist dies Ihre private Konvention und für den Leser nicht offensichtlich. Aber in natürlicher Sprache Worte mögen and, orund notin einem Booleschen Ausdruck, tatsächlich verbessern die Lesbarkeit und es hebt die Unterscheidung Bit Manipulationen. Daher sollten wir
meiner

@ DanNissenbaum Ich fand diese Option unter dem Namen C / C ++> Sprache> Spracherweiterungen deaktivieren , so dass es relativ sicher ist, Nebenwirkungen zu erwarten;)
Wolf

6
Wissen Sie , wie viele Python Fehler eingeführt worden , weil die Worte andund orVoreingenommenheit das Denken der Menschen, wie sie funktionieren sollte? ZB if (a == b or c)statt if (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.
Mark Ransom

10

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 .


6
Technisch gesehen handelt es sich um alternative Token, nicht um Schlüsselwörter. :)
GManNickG

2
@GMan: +1 Netter Anruf, die Dinkumware-Seite nennt sie jedoch Schlüsselwörter, also war ihnen die Unterscheidung wohl nicht so wichtig.
Chris Jester-Young


Unterstützt MSVC sie sofort in C ++, aber nicht in C?
29.

1
@rwst Ich kann MSVC nicht speziell kommentieren, aber wenn es die C ++ - und C-Standards korrekt implementiert, ist dies in der Tat der Fall. Siehe auch: stackoverflow.com/questions/2376448/…
Chris Jester-Young

2

andund &&sind in C ++ funktional gleich. Die Operatoren andund orsind 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:

int x = 3;
int y = 4;

// Explicitly use "and"
if (x and y) {
    cout << "and: x and y are both non-zero values" << endl;
}

// Using "&&"
if (x && y) {
    cout << "&&: x and y are both non-zero values" << endl;
}

// Oops! I meant to type "&&"!
if (x & y) {
    cout << "&: x and y are both non-zero values" << endl;
}
else {
    cout << "How did I get here?" << endl;
}

Alle drei if-Anweisungen werden kompiliert, aber die letzte bedeutet etwas ganz anderes und unbeabsichtigtes!

Wenn Sie immer verwenden, andwenn 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. ;)


1
Dies ist keine wirkliche Antwort auf die Frage. Sie geben nur an, was Ihrer Meinung nach besser lesbar ist. Das OP fragte, wie die geschriebenen Versionen funktionieren, nicht welche besser sind. Und jemand anderes hat bereits den gleichen Punkt gemacht, den Sie versuchen zu machen.
Nicol Bolas

Nicht, dass es wirklich weitere nützliche Informationen liefert, aber ich werde der Antwort " andund &&funktional identisch" hinzufügen ... Und wenn Sie meine Antwort lesen, werden Sie sehen, dass ich sage, dass es NICHT um Lesbarkeit geht;)
tjwrona1992
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.