Du musst nur beachten, falls eine Bedingung öfters erfüllt ist, dann wird immer das zuletzt aufgerufene IF bei der die Bedingung erfüllt ist ausgeführt.
Diese Aussage finde ich ziemlich irrführend.
Es werden
alle IFs ausgeführt, bei denen die Bedingungen erfüllt sind, wie man z.B. in folgendem Fall leicht testen kann ...
Code:
X := 0 ;
IF True Then
X := X + 1 ;
END_IF ;
IF True Then
X := X + 2 ;
END_IF ;
IF True Then
X := X + 4 ;
END_IF ;
IF True Then
X := X + 8 ;
END_IF ;
Y := X ;
Da die obigen IFs in keiner Weise ineinander geschachtelt sind, sind sie alle unabhängig voneinander wirksam.
Es gibt natürlich viele Beispiele, in denen alle Wirkungen der vorausgegangenen erfüllten Bedingungen durch die letzte erfüllte Bedingung wieder zunichte gemacht werden. Nur dann stimmt zufällig die Aussage.
Deswegen verwendet man normalerweise die IF und IF-ELSE Anweisung damit dieser Fall nicht eintreten kann.
Dass ausgerechnet deswegen die IF-ELSIF-Variante erfunden wurde bzw. verwendet wird, würde ich so auch nicht sagen.
Charakteristisch für die IF-ELSIF-Kette ist, dass immer genau einer der Zweige durchlaufen wird, wenn es den ELSE-Zweig gibt bzw.
höchstens einer der Zweige durchlaufen wird, wenn es den ELSE-Zweig nicht gibt.
In jedem Fall werden keine weiteren Bedingungen mehr geprüft, sobald eine der Bedingungen erfüllt ist.
Dies ist wichtig, wenn z.B. der Wert von Y/X als Bedingung auftaucht, man aber den Fall ausschliessen möchte, dass dabei X=0 ist:
Code:
IF X=0 Then
... ;
ELSIF Y/X=irgendwas Then // diese Bedingung wird nicht mehr abgefragt, wenn X=0 ist und
... ; // die Berechnung Y/X dann einen LaufzeitFehler produzieren würde
ELSE
... ;
END_IF ;
Anderes Beispiel:
man will ein ArrayElement abfragen, aber VORHER sicherstellen, dass der verwendete ArrayIndex nicht vor oder hinter den definierten ArrayBereich greift.
Es gibt allerdings ProgrammierSprachen (z.B. C), in denen man sinngemäss z.B. schreiben kann ...
Code:
IF X <> 0 AND Y / X >= Z THEN
// oder
IF Idx >= LowerBound(Array) AND Idx <= UpperBound(Array) AND Array(Idx) = 0 THEN
..., ohne dass es zu einem LaufzeitFehler kommt, weil alle folgenden Teile der Bedingung nicht mehr bearbeitet/geprüft werden, sobald klar ist, dass sie keinen Einfluss mehr auf das Ergebnis haben können. ('False UND irgendwas' kann genau so wenig True werden, wie 'True ODER irgendwas' False werden kann.)
Oben habe ich geschrieben "In jedem Fall werden keine weiteren Bedingungen mehr geprüft, sobald eine der Bedingungen erfüllt ist."
Das nutze ich gerne aus, wenn ich mit der/den ersten Abfrage[n] mit wenig Aufwand gleich alle oder zumindest viele der Fälle "aussortieren" kann, in denen die folgenden ELSIF-Abfragen sowieso nicht mehr relevant werden können.
Hierzu fällt mir leider nur ein Beispiel ein, das eigentlich oben schon angedeutet wurde:
Code:
IF Idx < LowerBound(Array) THEN
; // ggfs FehlerBehandlung für den Fall 'Index ist zu klein' ... oder "gar nix"
ELSIF Idx > UpperBound(Array) THEN
; // ggfs FehlerBehandlung für den Fall 'Index ist zu gross' ... oder "gar nix"
ELSIF Array(Idx) = 0 THEN
... ;
ELSE
... ;
END_IF ;