Dangling else

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

Beispiele

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 der Variablen der Wert 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 im Fall der Wert 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;

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:

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

Siehe auch

Literatur

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.