Die int-Variable x habe den Wert 5. Die folgende Anweisung führt dennoch nicht zueiner Division durch 0. Warum? if(x!= 5 && 1.0 / (x – 5) > 0) y = 1;?

6 Antworten

C oder Java?

In Java gibt es für Bedingungen das & und das &&.

Bei && wird der zweite Teil nur ausgeführt, wenn das Ergebnis noch nicht feststeht.

Durch die erste Bedingung x != 5 steht das Ergebnis fest.

false && true = false

false && false = false

Es ist also egal, ob die zweite Bedingung true oder false ist. Das Ergebnis ist false.

Daher wird der zweite Teil nicht mehr berechnet und es tritt kein "Division by zero" auf.

Wenn du in Java nur & statt && angibst, wird weiter ausgewertet und du bekommst deine "Division by zero".

Je nach Compiler/System wird && nur weiter durchgeführt, falls es sich "lohnt", den restlichen Teil zu prüfen. Ist der erste Teile bereits false, kann nur der ganze Ausdruck false sein, also wird die Ausführung (intern) abgebrochen.


Lppll  28.10.2019, 03:43

Das hat nix mit dem Compiler zu tun, sondern ist immer so.

Short-Circuits sind im Standard strikt definiert und jeder Compiler hält sich daran.

0

Wo genau liegt das Problem? erstmal ist x!=5 für x = 5 natürlich falsch, also ist die Und Verknüpfung && auch sofort falsch, somit wird die if Abfrage nicht ausgeführt

Das liegt daran, dass beim && Operator nur dann der zweite Teil ausgewertet wird, wenn der erste Teil "true" ergibt.

Da x ja nicht ungleich 5 ist, wird 1.0 / (x – 5) > 0) also gar nicht erst ausgewertet.

Vermutlich, da nach x!=5 die restlichen Bedingungen nicht geprüft werden, wenn diese mit und (&&) verknüpft sind.