Jede Methode, die Werte egal welchen Typs zurück gibt, kann in Boole'schen Ausdrücken verwendet werden, also sind Seiteneffekte zu beachten.
Zum Beispiel angenommen, dass eine Methode berechneMaximum()
das Maximum einer Anzahl von Variablen berechnet, den Wert in maximum
speichert und diesen Wert zurückgibt:
int summe; int maximum; // bestimmt durch berechneMaximum() . . . if ( summe < 100 && berechneMaximum() < 500 ) // maximum könnte nicht berechnet worden sein { . . . } ergebnis = 2 * maximum ;
Es gibt ein Problem hier. Die Methode, die auf &&
folgt, bestimmt maximum
(als Seiteneffekt) nur dann, wenn summe
kleiner als 100 ist. Die Zuweisungsanweisung wird manchmal den falschen Wert in ergebnis
stellen. Sie sollten den Ausdruck folgendermaßen umstellen:
int summe; int maximum; . . . if ( berechneMaximum() < 500 && summe < 100 ) { . . . } ergebnis = 2 * maximum ;
Mit dieser Umstellung wird der Seiteneffekt berechneMaximum()
immer ausgeführt. Auch wenn diese beiden if
-Anweisungen nahezu identisch aussehen, ist die erste (wohl) ein Bug. Bugs wie dieser können schwer zu finden sein.
Die beste Lösung ist die Methode berechneMaximum()
so zu schreiben, dass sie keinen Seiteneffekt hat. Wir verwenden sie daher folgendermaßen:
int summe;
int maximum;
. . .
maximum = berechneMaximum();
if ( maximum < 500 && summe < 100 )
{
. . .
}
ergebnis = 2 * maximum ;
Wäre es sinnvoll einen Non-Short-Circuit AND-Operator zu haben?