Geschweiften Klammern für Dummys
-
Geschweiften Klammern für Dummys
Immer wieder bleibe ich im Gestrüpp der geschweiften Klammern hängen.
Daher eine ganz blöde Frage.
Warum, wann und wie setzt man sie richtig?
-
Deinem vorherigen Thread nach, meinst du die Klammern um Codeblöcke? Es gibt nämlich auch noch geschweifte Klammern in anderen Zusammenhängen. Bei den Codeblöcken sagt der Name eigentlich schon alles: Code der zwischen geschweiften Klammern steht, gilt als eine abgeschlossene Einheit.
"Abgeschlossen" in dem Sinne, dass Code der drumherum steht, nichts von dem weiß, was da drinnen vorgeht (Aber nicht umgekehrt: Der Code in den Klammern kann auf Sachen von außerhalb zugreifen).
"Einheit" in dem Sinne, dass der Codeblock als ein einzelne Anweisung.Da deine Schwierigkeit vor allem bei Kontrollstrukturen zu liegen scheint: Die Kontrollstrukturen haben allesamt eine Syntax in der Art
if(ausdruck) anweisung; // optional: else anweisung;
Und
anweisung
kann halt sowohl für "normale" Anweisungen stehen, als auch für zusammenhängende Anweisungen, also Codeblöcke.PS: Die Darstellung mit der Syntax ist nicht ganz korrekt. Der Standard definiert rekursiv, was eine Anweisung ist (so ist z.B. das ganze if ja selber wieder eine Anweisung). Es ist schwer, das sowohl anfängerfreundlich als auch 100% klugscheißersicher darzustellen.
edit: Bessere deutsche Übersetzungen für expression und statement.
-
SeppJ schrieb:
Deinem vorherigen Thread nach, meinst du die Klammern um Codeblöcke? Es gibt nämlich auch noch geschweifte Klammern in anderen Zusammenhängen. Bei den Codeblöcken sagt der Name eigentlich schon alles: Code der zwischen geschweiften Klammern steht, gilt als eine abgeschlossene Einheit.
"Abgeschlossen" in dem Sinne, dass Code der drumherum steht, nichts von dem weiß, was da drinnen vorgeht (Aber nicht umgekehrt: Der Code in den Klammern kann auf Sachen von außerhalb zugreifen).
"Einheit" in dem Sinne, dass der Codeblock als ein einzelne Anweisung.Da deine Schwierigkeit vor allem bei Kontrollstrukturen zu liegen scheint: Die Kontrollstrukturen haben allesamt eine Syntax in der Art
if(ausdruck) anweisung; // optional: else anweisung;
Und
anweisung
kann halt sowohl für "normale" Anweisungen stehen, als auch für zusammenhängende Anweisungen, also Codeblöcke.PS: Die Darstellung mit der Syntax ist nicht ganz korrekt. Der Standard definiert rekursiv, was eine Anweisung ist (so ist z.B. das ganze if ja selber wieder eine Anweisung). Es ist schwer, das sowohl anfängerfreundlich als auch 100% klugscheißersicher darzustellen.
edit: Bessere deutsche Übersetzungen für expression und statement.
Dazu gibt es eigentlich nur noch zu sagen,dass z.b. auch eine schleife ein codeblock ist
while (Bedingung){Code}
-
juhu123 schrieb:
Warum, wann und wie setzt man sie richtig?
Wenn beabsichtigt wird, daß dort, wo eigentlich nur ein Befehl stehen darf, gleich mehrere Befehle stehen, dann darf man folgenden Trick anwenden: Eine Folge von Befehlen in geschweiften Klammern ist ein Block, und ein Block ist ein Befehl. Man kann also überall da, wo ein Befehl möglich ist, auch einen Block setzen, der aus mehreren Befehlen besteht. Ein Block wird immer als nur ein einfacher Befehl angesehen. Alles, was im Block deklariert wird, ist außerhalb des Blocks nicht sichtbar.
#include <iostream> using namespace std; int main() {// Beginn des äußeren Blocks const float LIMIT=80; float geschwindigkeit; cout<<"Bitte geben Sie die Geschwindigkeit ein: "; cin>>geschwindigkeit; if(geschwindigkeit>LIMIT) {// Beginn des inneren Blocks cout<<"Zu schnell gefahren. "; if(geschwindigkeit>LIMIT+30) cout<<"Punkte in Flensburg!"<<endl; else cout<<"Verwarnungsgeld!"<<endl; }// Ende des inneren Blocks else cout<<"Nicht zu schnell gefahren."<<endl; }// Ende des äußeren Blocks
Oder nimm dies, Pursche!
{ const float LIMIT=80; float geschwindigkeit; cout<<"Bitte geben Sie die Geschwindigkeit ein: "; cin>>geschwindigkeit; if(geschwindigkeit>LIMIT) if(geschwindigkeit>LIMIT+30) cout<<"Zu schnell gefahren. Punkte in Flensburg!"<<endl; else cout<<"Nicht zu schnell gefahren."<<endl; }
Das klappt so nicht! Das zweite else gehört hier zum zweiten if. Richtig eingerückt wäre es
{ const float LIMIT=80; float geschwindigkeit; cout<<"Bitte geben Sie die Geschwindigkeit ein: "; cin>>geschwindigkeit; if(geschwindigkeit>LIMIT) if(geschwindigkeit>LIMIT+30) cout<<"Zu schnell gefahren. Punkte in Flensburg!"<<endl; else cout<<"Nicht zu schnell gefahren."<<endl; }
Ich wills aber haben wie oben. Also geschweite Klammern.
{ const float LIMIT=80; float geschwindigkeit; cout<<"Bitte geben Sie die Geschwindigkeit ein: "; cin>>geschwindigkeit; if(geschwindigkeit>LIMIT) { if(geschwindigkeit>LIMIT+30) cout<<"Zu schnell gefahren. Punkte in Flensburg!"<<endl; } else cout<<"Nicht zu schnell gefahren."<<endl; }
Es ist übrigens keine Schande, mehr davon zu nehmen als dringend nötig. Hängt davon ab, wie lange man dabei ist. Bei Unsicherheit empfehle ich diesen Stil hier:
{ const float LIMIT=80; float geschwindigkeit; cout<<"Bitte geben Sie die Geschwindigkeit ein: "; cin>>geschwindigkeit; if(geschwindigkeit>LIMIT) { if(geschwindigkeit>LIMIT+30) { cout<<"Zu schnell gefahren. Punkte in Flensburg!"<<endl; } } else { cout<<"Nicht zu schnell gefahren."<<endl; } }
Und ich empfehle. daß die } immer senkrecht unter der zugehörigen { steht, und der eingeschlossene Code gegen die einschließenden Klammern eingerückt ist, und daß die Klammern eine eigene Zeile kriegen, wie ich vorgemacht habe.
Man kann auch die öffnende Klammer hochziehen, das sähe dann so aus
{ const float LIMIT=80; float geschwindigkeit; cout<<"Bitte geben Sie die Geschwindigkeit ein: "; cin>>geschwindigkeit; if(geschwindigkeit>LIMIT) { if(geschwindigkeit>LIMIT+30) { cout<<"Zu schnell gefahren. Punkte in Flensburg!"<<endl; } } else { cout<<"Nicht zu schnell gefahren."<<endl; } }
und ist hier Schwachsinn. Das ergibt erst Sinn, wenn man konsequent geschweifte Klammern spart.
{ const float LIMIT=80; float geschwindigkeit; cout<<"Bitte geben Sie die Geschwindigkeit ein: "; cin>>geschwindigkeit; if(geschwindigkeit>LIMIT){ if(geschwindigkeit>LIMIT+30) cout<<"Zu schnell gefahren. Punkte in Flensburg!"<<endl; } else cout<<"Nicht zu schnell gefahren."<<endl; }
Gell, das ist viel häßlicher, wenns drum geht, mal schnell Übersicht zu haben.
~(Ich verwende die häßliche Variante.)~
ps: Das endl sollte durch '\n' ersetzt werden.
-
Man sollte lieber zu viele Klammern zu setzen, als zu wenige, also sobald man mehr als eine Zeile in einer Anweisung hat, sollten Klammern hin.
Auch wennfor (i=0; i<count; ++i) if (condition) foo();
richtig ist, sollte man daraus
for (i=0; i<count; ++i) { if (condition) foo(); }
machen. Alternativ kann man auch konsequent Klammern setzen, was gerade fuer Anfaenger wohl etwas einfacher ist.
(nur meine empfehlung)
-
Ich persönlich habe die Erfahrung, dass es im Laufe der Entwicklung besser ist, wenn man zunächst jeden if, else, while, for usw -Zweig grundsätzlich erstmal in { } einfasst.
Warum?
Weil man immer wieder, wenn der Code wächst, in die Situation kommt, hier und da doch noch Anweisungen einzufügen, und sei es eine notwendige Logausgabe. Und dann fügt man einfach die Zeile ein - fertig. Wenn man andererseits vorher die Klammern "gespart" hat (man "spart" sich gerade mal die beginnende, denn die IDE ergänzt einem die schließende Klammer ggf. automatisch), muss man sie jetzt doch wieder einfügen, und das ist gefühlt lästiger als wenn man es gleich tut.
Zudem ist man immer auf der sicheren Seite, wenn es um verschachtelte Anweisungen geht, also ein if innerhalb eines for, siehe die Beispiele der vorherigen Beiträge.vorher (toll was gespart!):
if ( isStoppschild ) bremsen(); else gibGummi();
dann doch:
if ( isStoppschild ) { // <--- nachträglich eingefügt kupplungTreten(); bremsen(); } // <--- und hier auch else gibGummi();
Nur wenn es ganz offensichtlich trivial ist und geradezu nach einem One-liner schreit, lasse ich sie weg.
if (index > LIMIT) throw logic_error( "Index too high." );
---------
Zur Frage, ob man die öffnende Klammer { direkt hinter die Anweisung setzt oder übereinander, existieren Glaubenskriege. Es ist schlicht egal. Wichtig nur: Im Team müssen sich alle gleich verhalten. In JavaScript gilt z.B. der Style-Guide, sie immer ans Ende der Anweisung zu setzen.Meine eigene Erfahrung ist wieder praktischer Art: Wenn man die Klammern übereinander in jeweils eine eigene Zeile schreibt, wird der Code zwar etwas länger, zugegeben, aber man kann sehr einfach einen kompletten Block inkl. Klammern markieren und an eine andere Stelle setzen / kopieren (der seine Klammern dann schon mitbringt). Liegt mir einfach mehr, das muss jeder selbst rausfinden.
-
minastaros schrieb:
Meine eigene Erfahrung ist wieder praktischer Art: Wenn man die Klammern übereinander in jeweils eine eigene Zeile schreibt, wird der Code zwar etwas länger, zugegeben, aber man kann sehr einfach einen kompletten Block inkl. Klammern markieren und an eine andere Stelle setzen / kopieren (der seine Klammern dann schon mitbringt). Liegt mir einfach mehr, das muss jeder selbst rausfinden.
Die quasi-freien Zeilen kann man gut fuer kleine Kommentare nutzen.
Ich habe das frueher auch so gemacht, inzwischen aber aufgegeben, weil man bei komplett konsistenter Anwendung selbst fuer die kleinsten lambdas vier Zeilen braucht und damit den Sinn von lamdas voellig verfehlt. Ich bin dann erst zum Stroustrup-Style gewechselt und inzwischen verwende ich einheitlich den Rust-style auch in C++.
-
volkard schrieb:
Das ergibt erst Sinn, wenn man konsequent geschweifte Klammern spart.
{ const float LIMIT=80; float geschwindigkeit; cout<<"Bitte geben Sie die Geschwindigkeit ein: "; cin>>geschwindigkeit; if(geschwindigkeit>LIMIT){ if(geschwindigkeit>LIMIT+30) cout<<"Zu schnell gefahren. Punkte in Flensburg!"<<endl; } else cout<<"Nicht zu schnell gefahren."<<endl; }
Gell, das ist viel häßlicher, wenns drum geht, mal schnell Übersicht zu haben.
das sieht nur wegen der nicht optimal gewählten Bezeichner "häßlicher" aus.
Mit anderen Bezeichnern (und ein paar Leerzeichen mehr) sieht es nicht mehr unübersichtlich aus, obwohl sich an der Struktur nichts geändert hat.
{ const float limit = 80; float v; cout << "Bitte geben Sie die Geschwindigkeit ein: "; cin >> v; if(v > limit){ if(v > limit + 30) cout << "Zu schnell gefahren ..." << endl; } else cout << "Nicht zu schnell gefahren." << endl; }
-
juhu123 schrieb:
Geschweiften Klammern für Dummys
Ich finds sogar schlimmer, dass du "Dummies" nicht richtig schreiben kannst.
-
Vielen Dank, jetzt bin ich erstmals beschäftigt und die Feiertage sind gerettet.
Bis bald.