2009-06-08 3 views
7

Ich sehe oft die baumelnden anders behandelt als:Wie gehen verschiedene Sprachen mit dem "dangling else" um?

if (x > 0) 
    if (y > 0) 
    print "hello" 
else 
    print "world" 

den Parser oder Dolmetscher mit dem nächsten die sonst eigentlich übereinstimmen if-Anweisung, die die „if (y> 0)“ ist.

Hat irgendeine Sprache die Falle, das else mit dem äußeren if oder dem am weitesten if zu vergleichen? (außer dem offensichtlichen Python)

+0

Interessante Frage, die aber wird man die richtige Antwort sein? – ralphtheninja

+1

ich denke, die antwort könnte lauten: es gibt wahrscheinlich keine sprache, die mit dem am weitesten entfernten if übereinstimmt. Einige Sprachen machen es zwingend erforderlich, dass Sie dies durch das Erzwingen von geschweiften Klammern verdeutlichen, oder verwenden Sie einfach die Einrückung, um anzugeben, welcher (Python) zugeordnet werden soll. –

Antwort

6

Kurz von der Verwendung von Leerzeichen-sensitiven Sprachen (wie Python, wie Sie sagten), sehe ich nicht, warum eine sinnvolle Interpretation würde die äußerste if Block.

Einige Sprachen verbieten, dieses Potenzial Mehrdeutigkeit von:

  1. Klammern für alle Blöcke erfordern, und
  2. spezielle "else if" Syntax Providing, in der Regel elsif, elif oder elseif.
2

In Perl Klammern nicht optional sind, die uns solche Probleme vermeiden hilft:

if ($x > 0) { 
    if ($y > 0) { 
     print "hello" 
    } 
    else { 
     print "world" 
    } 
} 

gegen

if ($x > 0) { 
    if ($y > 0) { 
     print "hello" 
    } 
} 
else { 
    print "world" 
} 

IIRC, die meisten C-Stil-Richtlinien erfordern/empfehlen Klammern für Schleifen und Bedingungen.

1

C# macht die "richtige" Sache. Visual Studio Smart Einzug setzt es automatisch an der richtigen Stelle zu:

if (x > 0) 
    if (y > 0) 
     Console.WriteLine("hello"); 
    else 
     Console.WriteLine("world"); 

Diese hoffentlich nur eine theoretische Frage sein sollte, da die Gewohnheit des Hinzufügens Curly überall sollte tief verwurzelt sein in den meisten C-Derivate, sonst Sie öffnen die Möglichkeit von bösen Überraschungen.

+0

Visual Studio neben Einzug, auch funktional entfernt die "Mehrdeutigkeit", mit einem "Ende wenn". "Das Problem kann auch dadurch gelöst werden, dass die Verbindung zwischen einem else und seinem if innerhalb der Syntax explizit gemacht wird. Dies hilft normalerweise, menschliche Fehler zu vermeiden. Wikipedia https://en.wikipedia.org/wiki/Dangling_else Mögliche Lösungen [zum" zweideutig "dangling else" sind: "Ein" Ende, wenn "Aussage. Beispiele für solche Sprachen sind ALGOL 68, Ada, Eiffel, PL/SQL, Visual Basic und Modula-2 "Ich denke auch, obwohl es nicht so zweideutig ist, da keine Sprache es auf diese andere Weise zu interpretieren scheint. – barlop

3

Wenn eine Sprache das getan hätte (außer für die indentationszentrischen Sprachen), müssten sie in eine der Listen "Was ist die schlechteste Sprache" gehen.

Aus diesem Grund verwende ich fast immer Klammern für Bedingungen und 100% der Zeit, wenn verschachtelte Bedingungen oder Schleifen vorhanden sind. Die wenigen zusätzlichen Zeichen sind es wert, die Möglichkeit der Verwirrung auszuschließen.

1

In Python können Sie nicht mehrdeutig sein. Entweder Sie haben

if (x > 0): 
    if (y > 0): 
    print "hello" 
else: 
    print "world" 

oder

if (x > 0) 
    if (y > 0) 
    print "hello" 
    else: 
    print "world" 

Die Vertiefung zeigt, welche "if" entspricht der "else". [Hinweis: Versuchen Sie, wie ich könnte, ich kann das "else" im ersten Beispiel nicht richtig unter dem ersten "wenn" ausrichten.]

In allen Sprachen, die ich gesehen habe, die diese besondere Ambiguität erlauben, das "else" stimmt mit dem letzten "if" überein. Das mag nicht für alle Sprachen gelten, die jemals existierten. Normalerweise ist es beim Schreiben des Parsers am einfachsten, das "else" mit dem nächsten "if" auf dem Stack zu vergleichen.

Eine ähnliche Frage: Was ist das Ergebnis von 5 - 2 + 1? Ist es 4 oder 2? Persönlich verwende ich immer Klammern, wenn ich (x - y) + z oder x - (y + z) schreibe, weil ich mich nie erinnern kann, auf welche Weise der Parser gehen wird.

+0

Für den letzten Teil, IMO wäre es nicht sinnvoll, wenn die Antwort 2 wäre. Wenn ich die Reihenfolge der Operationen für eine Sekunde ignoriere, wäre das nur rückwärts. Alle Sprachen, mit denen ich gearbeitet habe, gehen von links nach rechts Sprache wurde entworfen, um von rechts nach links zu sein, dann würde das Sinn machen, aber dann würde der Programmierer sich dessen bewusst sein.) –

+3

Es gibt 2 Möglichkeiten, 5 - 2 + 1 zu interpretieren, und beide ergeben 4 1 5 + (-2 +1) - kombinieren Sie die -2 und 1 zuerst 2. (5 - 2) + 1 - kombinieren Sie die 5 und -2 zuerst – Hardwareguy

0

Wenn es nicht mit dem neuesten if übereinstimmt, wird entweder das Ganze unsinnig oder Sie können andere ifs nicht zuordnen. Dies (die einzige echte Alternative, die ich mir vorstellen kann) würde keinen Sinn machen:

if(first) 
    if(second) 
     if(third) 
      doFirst(); 
     else 
      doSecond(); 
     else 
      doThird(); 

was einfach nur zu wtf ist.

0

Die meisten Sprachen werden die else mit der innersten if übereinstimmen, und das ist wirklich die einzige vernünftige Sache für einen nicht-whitespace-sensitiven Compiler zu tun. Viele IDEs, wie Jeff erwähnt, formatieren den Code, um der Struktur zu entsprechen, aber wirklich, Klammern mit allen Codeblöcken zu verwenden, ist solch eine vernünftige Weise, damit umzugehen.

+0

-1 "Die meisten Sprachen werden die else mit dem innersten" < --- das deutet darauf hin, dass Sie vielleicht einige wissen, die das tun nicht. Und was der Fragesteller fragte, war: Welche Sprachen nicht? Sie haben also die Frage vermieden, und Sie haben vorgeschlagen, dass einige Sprachen die andere Interpretation annehmen, wenn möglicherweise keine anderen Sprachen die andere Interpretation übernehmen.Wenn du "Die meisten Sprachen" sagst, solltest du mindestens 1 angeben, die das nicht tut, sonst irreführend. – barlop

1

Der Weg C# funktioniert, dass es die else-Anweisungen in der Reihenfolge der else-Anweisungen verwendet.

dh.

if (x == 1) 
    if (y == 1) 
     Console.WriteLine("Hello"); 
    else 
     Console.WriteLine("World"); 
else 
    Console.WriteLine("All your base are belong to us."); 

aber wenn Sie ändern möchten, wo das andere geht.

if (x == 1) 
{ 
    if (y == 1) 
     Console.WriteLine("Hello World"); 
} 
else 
    Console.WriteLine("All your base are belong to us."); 
0

COBOL, vor der Einführung der END-IF-Regeln, dass der ELSE zum nächstgelegenen gehört IF.

Um etwas anderes als das vorherige, muss man die IFs mit der gleichen Anzahl von ELSEs ausgleichen. Weil es einen Imperativ geben muss, muss eine NEXT SENTENCE-Klausel hinzugefügt werden. Wie bei jedem anderen Fall [1] in COBOL scheint die Wahl der Lösung die denkbar ausführlichste zu sein.

[1]: Die Bewertung von SONST

Verwandte Themen