Sprachen wie z.B. Java und C # haben sowohl bitweise als auch logische Operatoren.
Logische Operatoren machen nur Sinn mit booleschen Operanden, bitweise Operatoren arbeiten auch mit Integer-Typen. Da C keinen booleschen Typ hat und alle Nicht-Null-Ganzzahlen als wahr behandelt, ist die Existenz von logischen und bitweisen Operatoren dort sinnvoll. Sprachen wie Java oder C # haben jedoch einen booleschen Typ, so dass der Compiler abhängig vom Typkontext automatisch die richtigen Operatoren verwenden kann.
Gibt es also einen konkreten Grund für logische und bitweise Operatoren in diesen Sprachen? Oder waren sie nur aus Gründen der Vertrautheit enthalten?
(Ich bin mir bewusst, dass Sie die "bitweisen" Operatoren in einem booleschen Kontext verwenden können, um den Kurzschluss in Java und C # zu umgehen, aber ich habe noch nie ein solches Verhalten gebraucht, also könnte es ein meist unbenutztes Spezial sein Fall)
1) Gibt es einen konkreten Grund dafür, logische und bitweise Operatoren in diesen Sprachen zu haben?
Ja:
2) Mir ist bewusst, dass Sie die "bitweisen" Operatoren in einem booleschen Kontext verwenden können, um das Kurzschließen in Java und C # zu umgehen,
Soweit C # reicht, ist das einfach nicht wahr.
C # hat zum Beispiel 2 boolesche UND-Operatoren: &
(full) und &&
(short), aber es erlaubt keine bitweisen Operationen auf booleschen Werten.
Es gibt also keine "Überlappung" oder Redundanz zwischen logischen und bitweisen Operatoren. Die beiden gelten nicht für die gleichen Typen.
in C #, mit booleschen
Bitweise verwendet es nur & amp; als Legacy-Syntax von C / C ++ .... aber es ist wirklich ganz anders. Wenn überhaupt, wäre es besser als ein völlig anderes Symbol, um jede Verwirrung zu vermeiden. Aber es sind nicht wirklich viele übrig, es sei denn, Sie wollten für & amp; & amp; & amp; oder ||| aber das ist ein bisschen hässlich.
Ich sage für Java
Wie Sie bereits gesagt haben, gibt es einen Unterschied zwischen &
und &&
(das gleiche gilt für |
und ||
), also benötigen Sie zwei Sätze boolescher Operatoren.
Nun, unabhängig von den obigen, benötigen Sie möglicherweise bitweise Operatoren und die beste Wahl ist &
, |
s.o. da Sie keine Verwirrung vermeiden müssen.
Warum Dinge komplizieren und die zweistellige Version verwenden?
Späte Antwort, aber ich werde versuchen, zu Ihrem eigentlichen Punkt zu kommen.
Sie haben Recht. Der einfachste Weg, um darauf hinzuweisen, ist zu erwähnen, dass andere typisierte Sprachen (wie Visual Basic) logische Operatoren haben, die sowohl auf boolesche als auch auf Integer-Ausdrücke einwirken können.
VB Oder Betreiber: Ссылка
VB Bitweises Beispiel: Ссылка
Das war eine Entscheidung für das Sprachdesign. Java und C # mussten nicht so sein, wie sie sind. Sie sind einfach so, wie sie sind. Java und C # haben tatsächlich einen Großteil ihrer Syntax aus Gründen der Vertrautheit von C geerbt. Andere sprachen nicht und funktionieren gut.
Eine Designentscheidung wie diese hat Konsequenzen. Die Kurzschlussauswertung ist eins. Mischtypen zu verbieten (was für Menschen verwirrend sein kann) ist ein anderer. Ich bin gekommen, um es zu mögen, aber vielleicht habe ich gerade zu lange Java angeguckt.
Visual Basic hat AndAlso und OrElse hinzugefügt, um eine Kurzschlussauswertung durchzuführen. Im Gegensatz zu anderen logischen Operatoren funktionieren diese nur auf Booleschen Werten.
VB OrElse: Ссылка
Kurzschlussbeschreibung: Ссылка
Die Unterscheidung wurde nicht getroffen, da eine starke Typisierung es unmöglich macht, nur eine Menge von logischen Operatoren in einer Sprache zu haben. Es wurde gemacht, weil sie eine Kurzschlussevaluation wollten und sie wollten einen klaren Weg, um dem Leser zu signalisieren, was passiert ist.
Der andere Grund (neben Kurzschlüssen), dass c und c ++ verschiedene Arten von logischen Operatoren haben, besteht darin, dass jede Zahl ungleich Null als TRUE interpretiert und Null als FALSE neu interpretiert wird. Um das zu tun, brauchen sie Operatoren, die ihnen sagen, dass sie so interpretieren sollen. Java lehnt diese ganze Neuinterpretation ab und wirft einen Fehler in Ihr Gesicht, wenn Sie versuchen, dies mit seinen logischen Operatoren zu tun. Wenn es nicht für die Kurzschlussevaluation wäre, wäre der einzige Grund, der übrig bleibt, einfach, weil sie wollten, dass die Operatoren anders aussehen, wenn sie verschiedene Dinge tun.
Also, wenn sich die Java und C # Sprachdesigner nicht darum gekümmert hätten, hätten sie einen Satz logischer Operatoren sowohl für bitweise als auch für boolesche Logik verwenden und herausfinden können, was basierend auf dem Operandentyp wie einige andere Sprachen zu tun ist machen. Sie haben es einfach nicht getan.
Tags und Links java c# logical-operators bitwise-operators