IMO, sie sind hauptsächlich in Java und C # enthalten, weil sie bereits in C ++ existierten. Die eigentliche Frage ist also, warum C ++ so ist. Nach dem Entwurf und der Entwicklung von C ++ (§16.3):
Das try
Schlüsselwort ist vollständig redundant, ebenso wie die { }
Klammern, außer wenn mehrere Anweisungen tatsächlich in einem try-Block oder einem Handler verwendet werden. Zum Beispiel wäre es trivial gewesen, Folgendes zuzulassen:
int f()
{
return g() catch(xxii) { // not C++
error("G() goofed: xxii");
return 22;
};
}
Ich fand dies jedoch so schwierig zu erklären, dass die Redundanz eingeführt wurde, um Supportpersonal vor verwirrten Benutzern zu schützen.
Edit: Was den Grund für die Verwirrung angeht, muss man meiner Meinung nach nur die falschen Behauptungen in @Tom Jefferys Antwort (und insbesondere die Anzahl der erhaltenen Up-Votes) betrachten, um zu erkennen, dass es ein Problem geben würde. Für den Parser ist dies nicht anders als das Abgleichen von else
s mit if
s - ohne geschweifte Klammern, um eine andere Gruppierung zu erzwingen, würden alle catch
Klauseln mit den neuesten übereinstimmen throw
. Für jene missverstandenen Sprachen, die es enthalten, finally
würden Klauseln dasselbe tun. Aus Sicht des Parsers unterscheidet sich dies kaum genug von der aktuellen Situation, um zu bemerken - insbesondere gibt es nach heutigem Stand der Grammatik nichts, um die catch
Klauseln zu gruppieren - die Klammern gruppieren die Anweisungen, die von der gesteuert werdencatch
Klauseln, nicht die catch-Klauseln selbst.
Aus der Sicht, einen Parser zu schreiben, ist der Unterschied fast zu gering, um es zu bemerken. Wenn wir mit so etwas beginnen:
simple_statement: /* won't try to cover all of this */
;
statement: compound_statement
| simple_statement
;
statements:
| statements statement
;
compound_statement: '{' statements '}'
catch_arg: '(' argument ')'
Dann wäre der Unterschied zwischen:
try_clause: 'try' statement
und:
try_clause: 'try' compound_statement
Ebenso für catch-Klauseln:
catch_clause: 'catch' catch_arg statement
gegen
catch_clause: 'catch' catch_arg compound_statement
Die Definition eines vollständigen Try / Catch-Blocks müsste sich jedoch nicht ändern. In jedem Fall wäre es so etwas wie:
catch_clauses:
| catch_clauses catch_clause
;
try_block: try_clause catch_clauses [finally_clause]
;
[Hier gebe ich [whatever]
etwas Optionales an und lasse die Syntax für a aus, finally_clause
da ich glaube, dass sie keinen Einfluss auf die Frage hat.]
Auch wenn Sie dort nicht versuchen, alle Yacc-ähnlichen Grammatikdefinitionen zu befolgen, lässt sich der Punkt ziemlich einfach zusammenfassen: Diese letzte Anweisung (beginnend mit try_block
) ist diejenige, bei der catch
Klauseln mit try
Klauseln abgeglichen werden - und sie bleibt genau die gleich, ob die Klammern erforderlich sind oder nicht.
Um es zu wiederholen / Fassen wir zusammen: die Klammern Gruppe zusammen die gesteuerten Aussagen durch die catch
s, aber nicht Gruppe der catch
s selbst. Als solche haben diese Klammern absolut keinen Einfluss auf die Entscheidung , welche catch
mit dem geht try
. Für den Parser / Compiler ist die Aufgabe in beiden Fällen gleichermaßen einfach (oder schwierig). Trotzdem zeigt die Antwort von @ Tom (und die Anzahl der abgegebenen Stimmen), dass eine solche Änderung die Benutzer mit ziemlicher Sicherheit verwirren würde .
for
die Teile so etwas heißeninitial
,condition
undstep
dainitial
muss keine Variable definiert undstep
kein Inkrement sein.