Was ist Kurzschlussauswertung (Short-Circuit Evaluation)?
Eine Art, die logischen Operatoren and und or auszuwerten, bei der die rechte Seite übersprungen wird, wenn die linke Seite allein das Ergebnis festlegt. Bei and wird die rechte Seite nicht ausgewertet, wenn die linke Seite falsch ist, bei or, wenn sie wahr ist. Häufig wird so ein Zugriff außerhalb des Bereichs verhindert, indem die Prüfung des Array-Bereichs auf die linke Seite gesetzt wird.
Japanische Bezeichnung: 短絡評価
„Kurzschlussauswertung (Short-Circuit Evaluation)“ kommt in 4 Übungsfragen aus 3 Themen vor, z. B. Grundlagen der Programmierung (Pseudocode nachverfolgen), Grundlagen der Programmiersprache C, Softwareentwicklung und Projektmanagement.
Fachgebiet: Grundlagen der Programmierung (Pseudocode nachverfolgen)
Wann sie das Ergebnis ändert
Enthält die rechte Seite einen Funktionsaufruf oder einen Array-Zugriff, kann das Ergebnis davon abhängen, ob die Auswertung abgekürzt wird. In „i ≦ n and a[i] ≠ x“ ist die linke Seite falsch, sobald i größer als n ist, daher wird a[i] nicht außerhalb des Arrays gelesen. Würden die beiden Seiten vertauscht, würde zuerst außerhalb des Arrays gelesen. Ändert eine auf der rechten Seite aufgerufene Funktion Variablen, ändert sich auch, wie oft sie aufgerufen wird.
Bedingungen damit formulieren
Mit der Kurzschlussauswertung lässt sich in einem einzigen Ausdruck eine Bedingung schreiben, die nur sinnvoll ist, wenn eine vorherige Bedingung gilt, etwa „innerhalb des Array-Bereichs, und dieses Element erfüllt die Bedingung“. Steht eine aufwendige Prüfung auf der rechten Seite, entfällt sie, wenn die linke Seite das Ergebnis bereits festlegt. Andererseits sollte Arbeit, die immer ausgeführt werden muss, nicht in eine Funktion auf der rechten Seite gelegt werden, weil diese womöglich nicht aufgerufen wird.
Häufige Fragen
Ist die Kurzschlussauswertung eine Optimierung?
In C, Java, Python und ähnlichen Sprachen ist die Kurzschlussauswertung keine Compiler-Optimierung, sondern Teil der Sprachdefinition. Programme, die sich darauf verlassen, dass die rechte Seite nicht ausgewertet wird, funktionieren daher garantiert korrekt.
Sind not (A or B) und not A and not B dasselbe?
Nach den De-Morganschen Gesetzen haben sie denselben Wahrheitswert. Sowohl not (i > n or a[i] = x) als auch i ≦ n and a[i] ≠ x werten a[i] nicht aus, wenn die Bedingung für i allein das Ergebnis festlegt.