Verzweigungen

Will man Teile eines Scriptblocks nur unter bestimmten Voraussetzungen ausführen lassen, sind Verzweigungen notwendig, die den weiteren Ablauf danach unterscheiden, ob das Ergebnis einer Berechnung logisch in TRUE oder FALSE kategorisiert werden kann.

if (...) endif

Das am häufigsten verwendete Strukturelement ist die IF-Verzweigung. Hinter dem Wort "IF" wird innerhalb von Klammern ein Formelausdruck verfasst, der logisch in TRUE oder FALSE aufgelöst wird. Der darunterstehende Code wird nur ausgeführt, wenn das Ergebnis TRUE ist. Beendet wird eine IF-Verzweigung immer mit "ENDIF", gefolgt von einem Semikolon.

$
if(v[1] >= 15)
  v[2] = 7;    // Nur falls die Bedingung eintritt.
endif;

Variable #2 wird nur dann auf 7 gesetzt, wenn Variable #1 mindestens bereits einen Wert von 15 erreicht hat.

if (...) else (...) endif

Um alternativ anderen Code auszuführen, falls die mit dem Formelausdruck angegebene Bedingung nicht eintritt, gibt es das Strukturelement "ELSE", das vor dem Ende einer IF-Verzweigung eingefügt werden kann.

$
if(v[1] >= 15)
  v[2] = 7;
else           // Falls die Bedingung nicht eintritt.
  v[2] = 8;
endif;

Variable #2 wird nur dann auf 7 gesetzt, wenn Variable #1 mindestens bereits einen Wert von 15 erreicht hat, andernfalls erhält sie den Wert 8.

if (...) elseif (...) else (...) endif

Innerhalb einer IF-Verzweigung kann beliebig oft ein "ELSEIF"-Strukturelement eingefügt werden, das jeweils eine alternative Bedingung zu der hinter dem "IF" stellt. Die Syntax von ELSEIF entspricht der von IF. Ebenfalls kein ein "ELSE" eingefügt werden, jedoch erst nach den "ELSEIF"-Elementen, also als letzte Abzweigung direkt vor "ENDIF".

$
if(v[1] >= 15)
  v[2] = 7;
elseif(v[1] >= 10)
  v[2] = 8;
elseif(v[1] >= 5)
  v[2] = 9;
elseif(v[1] >= 25) // Kann niemals eintreten.
  v[2] = 10;
else               // Falls nichts anderes eintritt.
  v[2] = 11;
endif;

Variable #2 wird auf 7 gesetzt, wenn Variable #1 mindestens einen Wert von 15 erreicht hat. Ist dies nicht erfüllt, erhält sie den Wert 8, wenn Variable #1 mindestens 10 beträgt. Sollte dies wiederum nicht eintreten, wird #1 auf einen Wert von mindestens 5 überprüft, bei Erfüllung wird #2 der Wert 9 zugewiesen.

Die darauffolgende Bedingung, dass Variable #1 mindestens 25 betragen soll, kann niemals eintreten, da sie, weil ELSEIF-Elemente immer in der angegebenen Reihenfolge geprüft werden, den vorangegangenen logisch widerspricht. Würde die vierte Bedingung zutreffen, könnte dies durch das zwanghafte Eintreten der ersten gar nicht erst überprüft werden.

Sollte keine der vorangegangenen Bedingungen einen TRUE-kategorischen Wert liefern, wird Variable #2 auf 11 gesetzt.

Mehrfachabfrage

Ein logischer Formelausdruck kann aus mehreren Teilen bestehen, so natürlich auch in IF-, bzw ELSEIF-Strukturelementen. Diese werden mit Operatoren der Kategorie "Logische Verknüpfung" zu einem Ausdruck verbunden.

$
if(v[1] >= 15 && v[2] < 50)      // Beides muss erfüllt sein.
  v[3] = v[1] + v[2];
elseif(v[1] >= 30 || v[2] < 100) // Eins muss erfüllt sein.
  v[3] = v[1] * v[2];
endif;

In der Bedingung des IFs wird überprüft, ob Variable #1 mindestens 15 beträt und #2 kleiner als 50 ist. Beide Teile müssen zutreffen, damit der Wert von Variable #3 aus #1 und #2 addiert wird. Andernfalls wird sie aus ihnen multipliziert, jedoch nur, wenn #1 mindestens einen Wert von 30 aufweist und/oder #2 kleiner als 100 ist (es reicht, wenn eines zutrifft).

Verschachtelung

IF-Verzweigungen können ineinander verschachtelt werden, falls bestimmte Teile des bereits unter Bedingung stehenden Codes wiederum nur unter noch spezielleren Bedingungen ausgeführt werden sollen.

$
if(v[1] == 5)
  v[2]++;
  if(v[2] == 10) // Ab hier identisch zu "v[1] == 5 && v[2] == 10".
    v[3]++;
    v[2] = 0;
  endif;
endif;

switch (...) case (...) endswitch

"SWITCH"-Verzweigungen überprüfen den Wert eines einzelnen Formelausdrucks und vergleichen diesen mit beliebig vielen anderen Werten. Die erstbeste Fallbehandlung (gekennzeichnet durch das Strukturelement "CASE", einen Wert/Formelausdruck und einen abschließenden Doppelpunkt), deren Wert identisch ("==") ist, wird ausgeführt.

$
v[2] = 0;
switch(v[1])
case 0:      // Im Fall von 0.
  v[2]++;
case 1:      // Im Fall von 1 oder nach 0.
  v[2]++;
endswitch;

Zu beachten ist, dass wenn der Code eines Falls fertig verarbeitet wurde, mit dem darunterstehenden fortgefahren wird. Das führt dazu, dass das jeweilige "v[2]++;" im obengenannten Beispiel von beiden ausgeführt wird, falls Variable #1 den Wert 0 innehat.

Verzweigung verlassen

Damit jeweils nur ein "CASE" ausgeführt wird und nicht mehrere, muss jeder Code-Abschnitt, bei dem dies verhindert werden soll, abgesehen vom letzten, mit einer "BREAK"-Anweisung enden.

$
v[2] = 0;
switch(v[1])
case 0:      // Im Fall von 0.
  v[2]++;
  break;
case 1:      // Im Fall von 1.
  v[2]++;
  break;
endswitch;

Mehrfachfälle

Es kann vorkommen, dass mehrere mögliche Werte ein und denselben Code ausführen sollen. Dies kann mit dem Nennen mehrerer CASEs aneinander erreicht werden und ist nur durch die zuvor genannte technische Beschaffenheit möglich, dass nach dem Abarbeiten eines Abschnitts der nächste folgt, selbst wenn dessen Voraussetzung nicht eingetroffen ist.

$
switch(v[1])
case 0: case 1:
  v[2] = 5;
  break;
case 2: case 3: case 4: case 5:
  v[2] = 17;
  break;
endswitch;

switch (...) case (...) default (...) endswitch

Möchte man alternativen Code ausführen, falls der geprüfte Wert mit keinem CASE übereinstimmt, kann ein "DEFAULT"-Strukturelement eingefügt werden.

$
switch(v[1])
case 0:
  v[2] = 11;
  break;
case 1: case 2:
  v[2] = 31;
  break;
default:        // Falls kein Vergleichswert zutrifft.
  v[2] = 17;
endswitch;

Vergleich zwischen if und switch

Das nachfolgende Code ist eine Umsetzung des vorherigen SWITCH-Block-Beispiels in IF-Form.

$
if(v[1] == 0)
  v[2] = 11;
elseif(v[1] == 1 || v[1] == 2)
  v[2] = 31;
else
  v[2] = 17;
endif;

Vorteile von SWITCH-Blöcken bestehen darin, dass sie oftmals übersichtlicher sind, der Code schneller ausgeführt werden kann und, wenn man es nutzen möchte, mehrere Fälle aufeinander folgen können.

Die Nachteile gegenüber einem IF-Block sind, dass lediglich nur ein Wert zum Vergleich in auch nur einer Vergleichsart steht und sehr häufig BREAKs hinzugefügt werden müssen, um Ablauffehler zu vermeiden, was schnell vergessen werden kann.