Programmiersprache Pascal

Shortcuts

Bei der Auswertung von komplexeren logischen Ausdrücken ist es möglich, eine Auswertungskette abzubrechen (shortcut), wenn bereits nach Auswertung eines Teils der Terme das Ergebnis feststeht.
Auf diese Art und Weise kann die Arbeitsgeschwindigkeit erhöht werden.
Es wird auch von einem Kurzschlußverfahren gesprochen.

Standard Pascal Systemen wird nachgesagt, daß sie keine Shortcuts bei der Auswertung von Ausdrücken, welche die logischen Operatoren NOT, AND, OR enthalten, vornehmen.

Extended Pascal stellt spezielle Shortcut-Operatoren (short circuit operators) zur Verfügung:

  AND_THEN     logisches Und
  OR_ELSE      logisches Oder
Die Arbeitsweise ist folgende:
Durch AND und OR werden logische Ausdrücke verknüpft. Dabei müssen sämtliche Ausdrücke ausgewertet werden. Die Auswertung von Ausdrücken innerhalb einer Anweisung erfolgt von links nach rechts.
In bestimmten Fällen steht jedoch das Ergebnis bereits nach Prüfung des linken Ausdrucks fest, d.h. die Auswertung des rechten Ausdrucks ist überflüssig. AND_THEN und OR_ELSE brechen in solchen Situationen die Auswertungskette im Gegensatz zu AND und OR ab.

Mit diesen Operatoren wird - bei komplizierteren Ausdrücken - eine Einsparung von Rechenzeit möglich. Zum anderen kann aber auch das eventuelle Auftreten von Programmausnahmen bei der weiteren Auswertung von Ausdrücken von vornherein unterbunden werden.

Es besteht jedoch eine Gefahr:
Sind die unterdrückten Operationen nicht nebenwirkungsfrei, so können Probleme auftreten, wenn die "Nebenwirkungen" wesentlich sind. Auf diese Gefahr sollte besonders dann geachtet werden, wenn die Ausdrücke Funktionsaufrufe enthalten.

Beispiel (Extended Pascal):

  PROGRAM shortcut(OUTPUT);
  
  FUNCTION f(x: REAL) : REAL;
  BEGIN
    f := x;
    Writeln('  f called');
  END;
  
  VAR x : REAL VALUE 6.6;
      y : REAL VALUE 5.5;
      z : REAL VALUE 7.7;
  
  BEGIN
    IF ( x > y ) AND_THEN ( y > f(z) ) THEN   { f wird aufgerufen }
      Writeln('True')
    ELSE
      Writeln('False');
  
    IF ( x < y ) AND_THEN ( y > f(z) ) THEN   { f wird nicht aufgerufen }
      Writeln('True')
    ELSE
      Writeln('False');
  
    IF ( x > y ) OR_ELSE ( y > f(z) ) THEN    { f wird nicht aufgerufen }
      Writeln('True')
    ELSE
      Writeln('False');
  
    IF ( x < y ) OR_ELSE ( y > f(z) ) THEN    { f wird aufgerufen }
      Writeln('True')
    ELSE
      Writeln('False');
  END.
Beispiel:
  IF ( y <> 0 ) AND ( x DIV y ) THEN ...;
Es droht bei y = 0 eine Division durch Null, wenn das Shortcut-Verfahren nicht angewendet wird.
  IF ( y <> 0 ) AND_THEN ( x DIV y ) THEN ...;
Die Division wird bei y = 0 nicht ausgeführt.

Turbo Pascal, Delphi

Mittels Compiler-Option kann festgelegt werden, wie die Auswertung logischer Ausdrücke erfolgt:

  $B-     shortcut               Standard
  $B+     volle Auswertung
In Turbo Pascal gilt dieses Standardverhalten ab der Version 6.0



P. Böhme, 31.07.1996