Dangeling else

Dangeling else

Das Problem des dangling else (engl. dangling = 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.

Inhaltsverzeichnis

Beispiel (in C)

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

In diesem Beispiel erwarten einige Nutzer, dass für den Fall a \neq 1 der Variablen b der Wert 42 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 b im Fall a \neq 1 der Wert 42 zugewiesen werden, muss die äußere if-Anweisung geklammert werden:

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

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:

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

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

if a == 1:
    if b == 1:
        a = 42
else:
    b = 42

In Ada tritt dieses Problem durch eine eindeutige syntaktische Klammerung nicht auf. Jedes IF wird durch ENDIF abgeschlossen:

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

Siehe auch

Quellen

Erläuterung für Visual C# (deutsch)


Wikimedia Foundation.

Игры ⚽ Нужно решить контрольную?

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”