Warum unterscheidet man logische und bitweise Operatoren in Java und C #?

8

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)

    
Askaga 01.01.2013, 20:59
quelle

6 Antworten

6
  

1) Gibt es einen konkreten Grund dafür, logische und bitweise Operatoren in diesen Sprachen zu haben?

Ja:

  • Wir haben boolesche Operatoren, um boolesche Logik (auf booleschen Werten) zu machen.
  • Wir haben bitweise Operatoren, um bitweise Logik (auf ganzzahligen Werten) zu machen.
  

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.

    
Henk Holterman 01.01.2013 21:06
quelle
3

in C #, mit booleschen

  • & amp; & amp; ist ein logischer Kurzschlußoperator
  • & amp; ist ein nicht kurzgeschlossener logischer Operator

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.

    
Keith Nicholas 01.01.2013 21:07
quelle
2

Ich sage für Java

  • Logischer Operator ist ein Benutzer mit booleschen Werten und bitweise Operatoren werden mit ints verwendet. Sie können nicht gemischt werden.
  • Warum reduzieren Sie sie nicht auf einen Operator wie "& amp;" oder "|"? Java wurde entwickelt, um für C / C ++ - Benutzer freundlich zu sein, daher erhielt es ihre Syntax. Heutzutage können diese Operatoren wegen der Abwärtskompatibilität nicht reduziert werden.
madhead 01.01.2013 21:05
quelle
2

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?

    
Radu Stoenescu 01.01.2013 21:07
quelle
2

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.

    
CandiedOrange 27.04.2014 18:21
quelle
1
Der

-Compiler kann nicht auf einen geeigneten Operator schließen, der nur auf Argumente schaut. Es ist eine Geschäftsentscheidung, welche man wählt. es geht um faule Berechnungen. z.B.

%Vor%

und jetzt: a() & b() führt doStuffB() aus und a() && b() nicht

    
piotrek 01.01.2013 21:13
quelle