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.

In Programmiersprachen

In vielen Sprachen wie C, Java und Python verwenden die logischen Operatoren && und || (in Python and und or) die Kurzschlussauswertung. In C und Java werten & und | immer beide Seiten aus. Beeinflusst die Kurzschlussauswertung in einer Pseudocode-Aufgabe das Ergebnis, gilt die Erklärung in der Aufgabe.

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.

Jetzt üben: Fragen zu Kurzschlussauswertung (Short-Circuit Evaluation)

Für die Entscheidung „A und B“ (A und B sind Bedingungen, deren Wahrheitswerte sich unabhängig festlegen lassen) wurden die beiden Testfälle (A = wahr, B = falsch) und (A = falsch, B = wahr) ausgeführt. Welche Aussage über die Abdeckungskriterien ist richtig?

  1. AZweigabdeckung ist erreicht, Bedingungsabdeckung nicht
  2. BSowohl Zweigabdeckung als auch Bedingungsabdeckung sind erreicht
  3. CBedingungsabdeckung ist erreicht, Zweigabdeckung nicht
Antwort und Erläuterung anzeigen

Antwort: C. Bedingungsabdeckung ist erreicht, Zweigabdeckung nicht

Die Bedingungsabdeckung verlangt, dass jede einzelne Bedingung einer Entscheidung (A und B) mindestens einmal wahr und einmal falsch ist. In den beiden Testfällen sind A und B je einmal wahr und einmal falsch, die Bedingungsabdeckung ist also erreicht. „A und B“ ist jedoch in beiden Testfällen falsch, und der Zweig für eine wahre Entscheidung wird nie durchlaufen, daher ist die Zweigabdeckung nicht erreicht. Da Bedingungsabdeckung allein keine Zweigabdeckung garantiert, werden Kriterien verwendet, die beides erfüllen, etwa die Entscheidungs-/Bedingungsabdeckung. Diese Überlegung verwendet die Werte, die jeder Bedingung zugewiesen werden; bei Kurzschlussauswertung, wie mit && in C, wo die rechte Seite nicht ausgewertet wird, wenn die linke falsch ist, kann man stattdessen auch nur die tatsächlich ausgewerteten Bedingungen zählen.

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.

„Kurzschlussauswertung (Short-Circuit Evaluation)“ in den Erläuterungen

Fragen mit „Kurzschlussauswertung (Short-Circuit Evaluation)“ (4)

  1. Im folgenden Programm wertet and seine rechte Seite nicht aus, wenn die linke Seite false ist (Kurzschlussauswertung). cnt ist eine globale Variable. Welchen Wert hat cnt nach der Ausführung des Programms?
  2. Das folgende Programm sucht im Array a mit n Elementen den Wert x und speichert den Index, an dem er gefunden wird, in i. Die Array-Indizes beginnen bei 1. and und or werten ihre rechte Seite nicht aus, wenn die linke Seite allein das Ergebnis festlegt. Welche Bedingung an der Stelle von 【a】 liest a[n + 1] außerhalb des Arrays, wenn x nicht in a enthalten ist?
  3. Welche Ausgabe erzeugt der obige Code, in dem b++ rechts von && und || steht, bei der Ausführung?
  4. Für die Entscheidung „A und B“ (A und B sind Bedingungen, deren Wahrheitswerte sich unabhängig festlegen lassen) wurden die beiden Testfälle (A = wahr, B = falsch) und (A = falsch, B = wahr) ausgeführt. Welche Aussage über die Abdeckungskriterien ist richtig?

Verwandte Begriffe

Variable Array Zweigabdeckung (Branch Coverage) Argument Bitoperation Ganzzahldivision Kontrollstruktur Modulo-Operation Objektorientierte Programmierung Off-by-one-Fehler

Zur Glossarübersicht