&& und || sind nicht logische, sondern bedingte Operatoren?

62

Ich bin ein bisschen verwirrt von der MSDN C # -Dokumentation, die besagt, dass &und |logische Operatoren sind und dass &&und ||bedingte Operatoren.

Ich rufe immer wieder &&an ||und !logische Operatoren, also irre ich mich?

John V
quelle
4
Es scheint unlogisch, aber es gibt einen wichtigen Unterschied zwischen den beiden Klassen, und es ist wichtig, dass Sie nicht davon ausgehen, dass sie |beispielsweise austauschbar sind ||, obwohl sie in vielen Fällen ohne erkennbare Änderung des Programmverhaltens ausgetauscht werden können.
Daniel R Hicks

Antworten:

120

Ich bin ein bisschen verwirrt von der MSDN C # -Dokumentation, die besagt, dass &und |logische Operatoren sind und dass &&und ||bedingte Operatoren. Ich rufe immer wieder &&an ||und !logische Operatoren, also irre ich mich?

Nein; Du hast Recht.

In der MSDN-Dokumentation gibt es zahlreiche kleine, meist unwichtige Nomenklaturfehler. Ich habe versucht, so viele wie möglich herauszuholen, aber in Fällen, in denen es nicht ungeheuerlich falsch und irreführend ist, ist es nicht immer ein kluger Zeiteinsatz. Wechseln Sie zur Spezifikation, wenn Sie eine endgültige Aussage über den Namen eines C # -Features wünschen.

Also: die relevante Autorität ist die C # -Spezifikation, die in Abschnitt 7.11 besagt:

Die &, ^und |Operatoren sind die logischen Operatoren genannt.

Anschließend werden die integrierten logischen Operatoren weiter in ganzzahlige, enumerative, boolesche und nullable-boolesche logische Operatoren unterteilt. Es gibt auch benutzerdefinierte logische Operatoren. Einzelheiten finden Sie in der Spezifikation.

In Abschnitt 7.12 haben wir

Die Operatoren &&und ||werden als bedingte logische Operatoren bezeichnet. Sie werden auch als logische Kurzschlussoperatoren bezeichnet.

Alle von ihnen sind logische Operatoren. Einige von ihnen sind bedingte logische Operatoren .

Was macht die bedingten logischen Operatoren bedingt ? Man könnte vermuten, dass dies der Fall ist, weil sie normalerweise in bedingten Anweisungen ( if) oder bedingten Ausdrücken ( ? :) verwendet werden. Der wahre Grund ergibt sich aus der Spezifikation:

Die Operatoren &&und ||sind bedingte Versionen der Operatoren &und |: Die Operation x && yentspricht der Operation x & y, ywird jedoch nur ausgewertet, wenn sie xnicht falsch ist. Die Operation x || yentspricht der Operation x | y, ywird jedoch nur ausgewertet, wenn sie xnicht wahr ist.

Die bedingten logischen Operatoren werden daher benannt, weil der rechte Operand abhängig vom Wert des linken Operanden bedingt ausgewertet wird.

Wir können dies deutlicher sehen, indem wir feststellen, dass die bedingten logischen Operatoren nur "syntaktische Zucker" für bedingte Ausdrücke sind . x && yist einfach eine angenehmere Art zu schreiben x ? y : falseund x || yist einfach eine angenehmere Art zu schreiben x ? true : y. Die bedingten logischen Ausdrücke sind tatsächlich bedingte Ausdrücke.

Es gibt auch eine benutzerdefinierte Form des bedingten logischen Operators, die etwas knifflig ist. Einzelheiten finden Sie in der Spezifikation.

Weiterführende Literatur, wenn Sie dieses Thema interessiert:

Eric Lippert
quelle
3
@RobertHarvey: Richtig, die Tatsache, dass & auf Bools, Integer-Typen oder Enum-Typen, aber && nur auf Bools angewendet werden kann, hat nichts mit der Wahl zu tun, eine von ihnen als "bedingte" Form des Operators zu bezeichnen. Der bedingte Operator ist bedingt, weil seine Auswertungssemantik eine bedingte Verzweigung aufweist.
Eric Lippert
16
Ich habe den Eindruck, dass der Begriff "Kurzschluss-Operator" im beschriebenen Sinne weitaus populärer (und wahrscheinlich weniger zwiespältig) ist als "Bedingter Operator".
Doc Brown
15
@ DocBrown: Es ist sicherlich beliebt, aber ich fand diesen Namen immer irreführend; Es scheint von jemandem geprägt worden zu sein, der dachte, dass ein "Kurzschluss" und eine "Abkürzung", um ein Ergebnis zu erzielen, dasselbe sind. Ein Kurzschluss ist ein gefährlicher Fehler, der eine elektrische Anlage schnell zerstören kann. Wir haben "unsichere" Blöcke in C # als "unsicher" bezeichnet, da sie bei falscher Verwendung gefährlich sind . Lassen Sie uns die Dinge nicht niedlich, sondern irreführend nennen. Lassen Sie mich nicht einmal mit dem Elvis-Operator anfangen. :-)
Eric Lippert
26
@EricLippert: Während "Kurzschluss" für die breite Öffentlichkeit beängstigend klingt, glaube ich nicht, dass K & R über die tatsächliche Definition verwirrt war. In der Elektrotechnik ist das Kurzschließen eines Stromkreises nicht immer ein gefährlicher Fehler. Tatsächlich tun wir das die ganze Zeit absichtlich. Es bedeutet nur, einen unerwünschten Teil des Stromkreises auszuschalten, indem der Elektrizität ein kürzerer Pfad zugewiesen wird, dem sie folgen kann.
Hackerb9
1
@CortAmmon: Sie sollten den folgenden Abschnitt lesen, in dem ich darauf hinweise, dass die Semantik der benutzerdefinierten Operatoren leicht unterschiedlich ist und dass Sie die Spezifikation für Details sehen sollten.
Eric Lippert
27

In C # sind dies alles logische Operatoren.

int x = 0xABCD & 0xFF // x == 0xCD

&&und ||werden " bedingte logische Operatoren" genannt, weil sie kurzschließen.

bool someOtherCondition = true;
if (x == 0xEF && someOtherCondition) // someOtherCondition is not evaluated, 
                                     // because x == 0xEF is false

Beachten Sie, dass diese Terminologie von Sprache zu Sprache unterschiedlich ist. In C und C ++ &&und ||sind nur logische Operatoren. In Java werden &und |als bitweise Operatoren bezeichnet , während C und C ++ sie als arithmetische Operatoren klassifizieren .

Robert Harvey
quelle
3
Ja, Microsoft ist die Autorität, aber das maßgebliche Dokument ist die Spezifikation. Siehe Abschnitt 7.12, Bedingte logische Operatoren .
Eric Lippert
8
Die Moral der Geschichte lautet: Es ist wichtiger, genau zu verstehen, was diese Operatoren tun, als genau zu sagen, wie sie heißen.
Robert Harvey
21
Konzentrieren Sie sich auf das, was die Bediener tun, und hören Sie auf, sich mit dem Wortschatz zu beschäftigen. Siehe auch Benennung als schädlich .
Robert Harvey
4
+1. Alles, was in der Frage aufgelistet ist, sind nur Operatoren , die einen oder zwei Ausdrücke nehmen und zu einem Wert auswerten. Die Adjektive sind unnötige Haarspalterei.
Blrfl
-2

Der Punkt ist , dass &und |sind bitweise Operatoren, dh sie zu und Ertrag Bitkette Werte angewendet werden. Und bitweise ist ein sehr verbreiteter Begriff unter Programmierern.

Zum Beispiel 0xff & 0x00 == 0x00während 0xff | 0x00 == 0xff.

Und &&und ||werden auf Bedingungen angewendet und ergeben die üblichen Werte von Bedingungen; dh trueund false.

Zum Beispiel true && false == falsewährend true || false == true.

Daher &&und ||könnte man bedingte Operatoren nennen, auch wenn dies unter Programmierern kein üblicher Begriff ist.

Das weiß natürlich jeder C-, C ++ -, Java- und C # -Programmierer. Aber ich vermute, dass das Missverständnis passiert, weil "Bedingter Operator" kein Begriff ist, der von uns Programmierern häufig verwendet wird.

Hilton Fernandes
quelle
5
Das weiß natürlich jeder C-, C ++ -, Java- und C # -Programmierer. Das ist sehr unhöflich zu schreiben, was bedeutet, dass das OP dumm ist. Genauso wie Sie uns Programmierern schreiben , schließen Sie das OP aus. Bitte tu das nicht.
DarkDust
1
Ich glaube nicht, dass Ihre spätere Antwort nach der von Eric Lippert akzeptierten Antwort einen Mehrwert bringt , und im Übrigen ist es falsch, den Sinn der Frage nicht zu verstehen.
Honza Zidek
@DarkDust Jeder C-, C ++ -, Java- und C # -Programmierer sollte diese Operatoren verstehen. Das ist nicht unhöflich, sondern eine Tatsache .
Phil1970
1
@ Phil1970: OP scheint diese Operatoren zu verstehen, es geht um die Klärung der Benennung . In diesem Licht und unter Hervorhebung der relevanten Ausdrücke in Hiltons Antwort kann dieser Satz so interpretiert werden, dass jeder Programmierer über diese Namensdetails Bescheid weiß, aber Sie wissen es nicht . Dies ist falsch (wie aus den Diskussionen der anderen Antworten hervorgeht) und seine Formulierung ist unhöflich.
DarkDust
4
Sehr geehrte Damen und Herren, es tut mir leid, wenn meine Antwort unhöflich aussah. Englisch ist nicht die 1. Sprache. Auf jeden Fall wollte ich nie implizieren, dass das OP kein Programmierer war. Au contraire, ich meinte, dass er oder sie durch eine ungewöhnliche Benennung in dem Text, den er oder sie las, verwirrt war. Ich habe nur versucht, die ungewöhnliche Benennung durch Programmfragmente zu klären.
Hilton Fernandes