24.5 Kurz- und Langauswertung boolscher Ausdrücke

 

Version 1
mit i++

Download
KurzLang1.java
public class KurzLang1{
  public static void main(String[] args){
    int k=2;
    int i=4;
    boolean a,b;
    
    a = (k==3)&&(i++==4); //Kurzauswertung
    System.out.println(k+" "+i+" "+a);
    
    i=4;
    b = (k==3)&(i++==4);  //Langauswertung
    System.out.println(k+" "+i+" "+b);
  }
}

Die Ausgabe:

2  4  false
2  5  false

 

Dass a und b mit dem booleschen Werten false belegt sind, wundert nicht, da die Auswertung des Ausdrucks k==3 auf jeden Fall den booleschen Wert false liefert und damit der gesamte Ausdruck den Wert false bekommen muss. Man erkennt aber deutlich den Unterschied zwischen der Kurz- und der Langauswertung. Die Inkrementierung von i durch die "++" hinter dem i, kommt natürlich erst zum Tragen, wenn der Ausdruck rechts von dem Operator auch ausgewertet wird, was hier bei & aber nicht bei && geschieht. Welche Ausgabe erwaten wir, wenn wir k auf den Wert 2 abfragen, der Quellcode also so aussieht (Veränderungen sind gelb unterlegt)?

 

Download
KurzLang2.java
public class KurzLang2{
  public static void main(String[] args){
    int k=2;
    int i=4;
    boolean a,b;
    
    a = (k==2)&&(i++==4); //Kurzauswertung
    System.out.println(k+" "+i+" "+a);
    
    i=4;
    b = (k==2)&(i++==4);  //Langauswertung
    System.out.println(k+" "+i+" "+b);
  }
}
 

Die Ausgabe:

2  5  true
2  5  true

Dass wir für beide Ausgaben das Gleiche bekommen, erwarten wir, da beides mal die Ausdrücke rechts von den Operatoren ausgewertet werden müssen. Dass für i die Werte 5 ausgegeben werden, ist auch zu erwarten, dass aber die booleschen Ausdrücke a und b zu true ausgewertet werden, wundert schon.
Die Ausgabe wird verständlich, wenn man weiß, dass die Inkrementierung von i durch das doppelte +Zeichen ( "++") erst nach der Auswertung des Ausdrucks, in dem i++ vorkommt stattfindet. Zum "Zeitpunkt" des Vergleichs, und damit in dem Moment wo a und b ausgewertet werden, hat i noch den Wert 4, a und b müssen die Werte
true erhalten. Es gibt nun bei Java die Möglichkeit die Inkrementierung vor der Auswertung des Ausdrucks zu erzwingen. Statt i++ schreibt man ++i

 

Download
KurzLang3.java
public class KurzLang3{
  public static void main(String[] args){
    int k=2;
    int i=4;
    boolean a,b;
    
    a = (k==2)&&(++i==4); //Kurzauswertung
    System.out.println(k+" "+i+" "+a);
    
    i=4;
    b = (k==2)&(++i==4);  //Langauswertung
    System.out.println(k+" "+i+" "+b);
  }
}
 

Die Ausgabe: 

2  5  false
2  5  false

Was wir hier über die Kurz- und Langauswertung bei den und-Operatoren gesagt haben, gilt natürlich auch für die beiden oder-Operatoren.
Und was wir über die Inkrementierung mit dem ++Operator gesagt haben gilt entsprechend auch für den --Operator. Dem Leser wird empfohlen, sich selbst Übungsbeispiele zu konstruieren.

 
zu 24.6 Einige Gesetze der Boolschen Algebra
zur Startseite www.pohlig.de  (C) MPohlig 2005