Was ist in Java der Unterschied zwischen den Vernküpfungsoperatoren "&&" und "&"?

...komplette Frage anzeigen

2 Antworten

Hi!

Interessante Frage! Ohne was von Java zu verstehen hab ich mal versucht mich darüber zu informieren, mir bekannte Sprachen haben solche Operatoren nicht (...oder ich hab sie noch nicht entdeckt) - ich war neugierig :-)

Und: ich bin mir wirklich nicht sicher ob ich das richtig aufgefasst hab, aber so hab ich das verstanden... ich bitte um Korrektur wenn ichs verpeilt hab ;-)

 

Die beiden Operatoren dienen unterschiedlichen Anwendungsfällen, was vielleicht auch ihre Bezeichnung verrät:

& ist ein UND dass sich bitweise auf Integer anwenden lässt
&& ist ein logisches UND und findet bei Boolschen Ausdrücken Verwendung

...besser? Nein? Hat mir auch nicht geholfen. Also hab ich weitergesucht und das da gefunden:

& ist ein UND ohne "Short Circuit Evaluation"
&& ist ein UND mit "Short Circuit Evaluation"

"Short Circuit Evaluation" - der Name lässt sich mit "Kurzschlussausführung" übersetzen. Hat mir erstmal auch nichts gesagt - also, was das denn wieder?

 

Die englische Wikipedia hat da nen erklärenden Artikel - und auch Beispielcode, den ich dann - so glaube ich - verstanden habe:

http://en.wikipedia.org/wiki/Short-circuit_evaluation#Avoiding_the_execution_of_second_expression.27s_side_effects

Das Code-Snippet (...hier C, aber das tut mal nichts zur Sache):

int a = 0;
if (a != 0 && myfunc(b))
{
    do_something();
}

Da lichtete sich dann der Nebel.

Üblicherweise werden solche Vergleiche ja von rechts nach links der Reihe nach abgearbeitet. Nochmal eben schnell ein Beispiel:

if (a AND b AND c) ...etc...

Da wird zunächst a geprüft, was auch immer das ist - dann eben b und zuletzt c.

Die erwähnte "Short Circuit Evaluation" ist eine Möglichkeit um solche Vergleiche abzukürzen. Denn wenn beispielsweise a schon falsch ist - dann spielt es keine Rolle mehr was bei b oder c eigentlich rauskommt. Dieses if wird niemals erfüllt, da a ja bereits falsch ist und ich ja ausdrücklich nur den Fall verlange bei dem alle drei gleichzeitig wahr sind.

Ohne diese Operatoren, also bei ner herkömmlichen Bedingung, werden aber dennoch alle drei geprüft - auch wenn a schon falsch ist wird noch mit b und c weitergemacht.

Und genau das kann man mit dem entsprechenden Operator verhindern.

Schau dir jetzt nochmal das Code-Snippet von Wikipedia an: Da wird myfunc(b) niemals ausgeführt, da a ja zuvor auf den Wert 0 gesetzt wurde - und eben mit dem Operator && gearbeitet wurde.

Hätte man hier den Operator & verwendet, dann wäre die if-Bedingung zwar auch nicht erfüllt - aber myfunc(b) würde abgearbeitet werden. Und das kann manchmal eben zu ungewollten Ergebnissen führen - oder einfach nur zu Laufzeitfehlern.

 

Garkeine schlechte Idee, diese verschiedenen Operatoren. Ist doch ne schöne Möglichkeit um solche Vergleiche gezielt steuern zu können - und man kann sich Ausführungszeit sparen.

Reicht jetzt nicht ganz dass ich mich doch für Java interessieren würde, aber das'n schönes Feature :-)

Ich hoff das ist einigermaßen verständlich?

Grüße!

Nachtrag

(...oder ich hab sie noch nicht entdeckt)

Again what learned: ...Python kann das - und warscheinlich viele weitere Sprachen auch. Man benutzt da nur nicht die Zeichen & bzw. && - in Python wird das eben mit & und dem Wort and geregelt.

Aus der Kategorie: Dinge, die man anwendet, ohne sich darüber jemals Gedanken gemacht zu haben.

Doch, ist ne gute Frage! Gefällt mir!

0

Was möchtest Du wissen?