Zum Inhalt springen

Dangling else

aus Wikipedia, der freien Enzyklopädie
Dies ist die aktuelle Version dieser Seite, zuletzt bearbeitet am 21. Juni 2023 um 05:32 Uhr durch imported>Lómelinde (Kategorie:Wikipedia:Seite mit Syntaxhervorhebungsfehlern falsche Angabe lang="thinbasic" siehe auch Hilfe:Syntaxhighlight#Unterstützte Sprachen wurde wohl ersetzt oder geändert zu basic?).
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Das Problem des dangling else ({{Modul:Vorlage:lang}} Modul:Vorlage:lang:103: attempt to index field 'wikibase' (a nil value) ‚baumelnd‘) ist ein Beispiel für eine scheinbare Mehrdeutigkeit einer Programmiersprache, die für Verwirrung sorgen kann, insbesondere bei falscher Einrückung. Tatsächlich ist die Semantik in den meisten Sprachen eindeutig definiert, schon weil die Grammatik der Sprache sonst nicht eindeutig zerlegbar wäre. Das Problem taucht in einigen Programmiersprachen (wie C, C++, Java) auf, wenn zwei verschachtelten if-Anweisungen nur ein else-Zweig gegenübersteht. Es kann nur auftreten, wenn eine optionale Klammerung weggelassen wird.

Beispiele

Beispiel in C

<syntaxhighlight lang="c">

 if (a == 1)
   if (b == 1)
     a = 42;
 else
   b = 42;

</syntaxhighlight>

In diesem Beispiel erwarten einige Nutzer, dass für den Fall <math>a \neq 1</math> der Variablen <math>b</math> der Wert <math>42</math> zugewiesen wird. Der Compiler bezieht den else-Zweig allerdings auf die letzte if-Abfrage. Das Programm wird in dem Fall keine Zuweisung ausführen. Soll dagegen tatsächlich <math>b</math> im Fall <math>a \neq 1</math> der Wert <math>42</math> zugewiesen werden, muss die äußere if-Anweisung geklammert werden:

<syntaxhighlight lang="c">

 if (a == 1)
 {
   if(b == 1)
     a = 42;
 }
 else
   b = 42;

</syntaxhighlight>

Andere Programmiersprachen

In einigen Sprachen wird das Problem umgangen, indem jedem if eine „schließende Klammer“ zugeordnet werden muss. In der Skriptsprache Bourne-Shell steht beispielsweise fi für die schließende Klammer. Der obige Algorithmus lautet dann so:

<syntaxhighlight lang="bash"> if [ $a -eq 1 ] ; then

 if [ $b -eq 1 ] ; then
   a=42
 fi

else

 b=42

fi </syntaxhighlight>

In anderen Programmiersprachen (z. B. Python) umgeht man das Problem, indem man durch Einrücken strukturiert.

<syntaxhighlight lang="python"> if a == 1:

   if b == 1:
       a = 42

else:

   b = 42

</syntaxhighlight>

In Ada tritt dieses Problem durch eine eindeutige syntaktische Klammerung nicht auf. Jedes IF wird durch ENDIF abgeschlossen: <syntaxhighlight lang="ada"> IF a = 1 THEN

   IF b = 1 THEN
       a := 42;
   END IF;

ELSE

    b := 42;

END IF; </syntaxhighlight>

Auch in Basic wird jedes IF entweder durch END IF abgeschlossen (wie in Ada) oder bei einer einzelnen Anweisung diese hinter THEN (ohne Zeilenumbruch) angegeben: <syntaxhighlight lang="basic"> IF a = 1 THEN

   IF b = 1 THEN a = 42

ELSE

    b = 42

END IF </syntaxhighlight>

Siehe auch

Literatur

  • Guido Krüger: Handbuch der Java-Programmierung. 3. Auflage. Addison-Wesley, 2002, ISBN 3-8273-1949-8,+ Kapitel 6.2 Verzweigungen