Forum: PC-Programmierung C++: {} oder ()


von bambam (Gast)


Lesenswert?

Hallo zusammen,

eine Frage zur Initialisierung von Objekten in C++. Wann muss man 
geschweifte Klammern {} einsetzen und wann runde ()?

Ich habe verschiedene Schreibweisen in verschiedenen Quellcodes gesehen 
aber werde nicht so recht schlau draus.

Beitrag #5624722 wurde von einem Moderator gelöscht.
Beitrag #5624725 wurde von einem Moderator gelöscht.
von Jim M. (turboj)


Lesenswert?

bambam schrieb:
> Wann muss man
> geschweifte Klammern {} einsetzen und wann runde ()?

Wenn man solche Fragen noch hat, sollte man sich eher einführende 
Literatur zu C/C++ besorgen.

Das kann man in einem Forenpost nicht ernsthaft beantworten.

Daher ist der Tipp mit Google oder Amazon schon mal gar nicht so weit 
daneben...

von bambam (Gast)


Lesenswert?

Jim M. schrieb:
> Wenn man solche Fragen noch hat, sollte man sich eher einführende
> Literatur zu C/C++ besorgen.

Genau deswegen kauf ich mir gleich ein Buch

Jim M. schrieb:
> Das kann man in einem Forenpost nicht ernsthaft beantworten.

Wenn du es nicht weist wieso antwortest du dann überhaupt auf meine 
Frage?



Eine kompetente Antwort kommt sicher noch.

von KI-Besitzer (Gast)


Lesenswert?

bambam schrieb:
> Wann muss man
> geschweifte Klammern {} einsetzen und wann runde ()?

Geschweifte und runde Klammern setzt man ein, wenn man nicht keine 
Klammern einsetzt will, wie es hier gemacht wird: 
https://github.com/openatv/enigma2/blob/6.2/lib/dvb/amldecoder.cpp#L67 
:D

von Rolf M. (rmagnus)


Lesenswert?

bambam schrieb:
> Jim M. schrieb:
>> Wenn man solche Fragen noch hat, sollte man sich eher einführende
>> Literatur zu C/C++ besorgen.
>
> Genau deswegen kauf ich mir gleich ein Buch

Sehr gut. Dann kannst du es ja dort nachlesen.

> Eine kompetente Antwort kommt sicher noch.

Die steht dann in deinem Buch. Warum willst du hier unbedingt jemandem 
die Mühe machen, das alles nochmal zu erklären?

von Daniel V. (voda) Benutzerseite


Lesenswert?

Rolf M. schrieb:
> bambam schrieb:
>> Jim M. schrieb:
>>> Wenn man solche Fragen noch hat, sollte man sich eher einführende
>>> Literatur zu C/C++ besorgen.
>>
>> Genau deswegen kauf ich mir gleich ein Buch
>
> Sehr gut. Dann kannst du es ja dort nachlesen.
>
>> Eine kompetente Antwort kommt sicher noch.
>
> Die steht dann in deinem Buch. Warum willst du hier unbedingt jemandem
> die Mühe machen, das alles nochmal zu erklären?

Lass die Trolle labern...

In C und C++ grenzen die geschweifte Klammern eine Funktion ein z.B. If, 
while, for, switch usw werden mit {} abgeschossen.

Die runden Klammern brauchst Du z.B. wenn du Werte in einer Funktion 
übergeben willst oder aber auch zum rechnen.

Gruß
Daniel

von Klammeraffe (Gast)


Lesenswert?

Niemand weiß genau, wann welche Klammern eingesetzt werden müssen. 
Normalerweise verwendet man am Anfang nur {} und ersetzt sie dann 
schrittweise mit (), bis sich das Programm kompilieren lässt.

von Wilhelm M. (wimalopaan)


Lesenswert?

Schau mal bei "uniform initialization syntax"  nach

bzw: hier:

https://en.cppreference.com/w/cpp/language/value_initialization

von A. S. (Gast)


Lesenswert?

Daniel V. schrieb:
> Lass die Trolle labern

Genau. Die geschweiften Klammern nach denen der TO fragt sind nämlich 
die, mit denen Arrays oder Strukturen initialisiert werden.

Rund sind die beim initialisieren nur, wenn explizit oder implizit eine 
Funktion dafür aufgerufen wird, z.b. der Konstruktor

von Wilhelm M. (wimalopaan)


Lesenswert?

Achim S. schrieb:
> Daniel V. schrieb:
>> Lass die Trolle labern
>
> Genau. Die geschweiften Klammern nach denen der TO fragt sind nämlich
> die, mit denen Arrays oder Strukturen initialisiert werden.
>
> Rund sind die beim initialisieren nur, wenn explizit oder implizit eine
> Funktion dafür aufgerufen wird, z.b. der *Konstruktor*

Nein!
Schau in der Doku nach:

https://en.cppreference.com/w/cpp/language/value_initialization

von derElf (Gast)


Lesenswert?

Die C++ Core Guidelines (Sammlung von Richtlinien zum C++ programmieren) 
empfehlen immer {} zu nutzen: 
https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Res-list

von derElf (Gast)


Lesenswert?

> Genau. Die geschweiften Klammern nach denen der TO fragt sind nämlich
> die, mit denen Arrays oder Strukturen initialisiert werden.

> Rund sind die beim initialisieren nur, wenn explizit oder implizit eine
> Funktion dafür aufgerufen wird, z.b. der Konstruktor

Das ist für C++ definitiv falsch.

von nocheinGast (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Schau mal bei "uniform initialization syntax"  nach

Ich wollte dir mal dafür danken, dass du als erster die Frage gelesen, 
darüber nachgedacht und ein Stichwort genannt hast, nach dem sich auch 
vernünftig suchen lässt. So trivial wie alle tun, ist die Antwort 
nämlich gar nicht.

von Wilhelm M. (wimalopaan)


Lesenswert?

nocheinGast schrieb:
> Wilhelm M. schrieb:
>> Schau mal bei "uniform initialization syntax"  nach
>
> Ich wollte dir mal dafür danken, dass du als erster die Frage gelesen,
> darüber nachgedacht und ein Stichwort genannt hast, nach dem sich auch
> vernünftig suchen lässt. So trivial wie alle tun, ist die Antwort
> nämlich gar nicht.

Schön, wenn ich Dir helfen konnte.

Tipp: solche Fragen stellt man am besten bei stackoverflow statt hier 
;-)

von Rolf M. (rmagnus)


Lesenswert?

nocheinGast schrieb:
> Ich wollte dir mal dafür danken, dass du als erster die Frage gelesen,
> darüber nachgedacht und ein Stichwort genannt hast, nach dem sich auch
> vernünftig suchen lässt. So trivial wie alle tun, ist die Antwort
> nämlich gar nicht.

Keiner hat hier so getan, als sei es trivial. Ganz im Gegenteil! Gerade 
deshalb wurde ja angeraten, es besser in einem Buch nachzulesen.

von M.K. B. (mkbit)


Lesenswert?

An den Kommentaren von einigen Vorgänger (Trolle ausgenommen), merkt 
man, dass diese die Neuerungen in den C++ Standards noch nicht 
mitbekommen haben. Das soll auch gar kein Vorwurf sein, weil man je nach 
Buch oder sonstiger Quelle gar nicht drauf kommt.

Schau dir sonst mal diesen Vortrag:
https://www.youtube.com/watch?v=7DTlWPgX6zs

Josuttis stellt sich auch die Frage, was man jetzt verwenden soll, was 
aber gar nicht so leicht zu entscheiden ist.

von Keiner N. (nichtgast)


Lesenswert?

M.K. B. schrieb:

Den Link wollte ich auch grad raussuchen. Der Vortrag hat mich doch ein 
wenig geschockt. Immerhin gibt er zu, dass das ganze aus dem Ruder 
gelaufen ist :)

von Nano (Gast)


Lesenswert?

bambam schrieb:
> Hallo zusammen,
>
> eine Frage zur Initialisierung von Objekten in C++. Wann muss man
> geschweifte Klammern {} einsetzen und wann runde ()?
>
> Ich habe verschiedene Schreibweisen in verschiedenen Quellcodes gesehen
> aber werde nicht so recht schlau draus.

Fang mit Python an, dann musst du dir darüber erst einmal keine Gedanken 
machen.

von Karl K. (karl2go)


Lesenswert?

Rolf M. schrieb:
> Die steht dann in deinem Buch. Warum willst du hier unbedingt jemandem
> die Mühe machen, das alles nochmal zu erklären?

Mal ehrlich, kauft sich einer im Jahr 2018 noch totes Holz für sowas?

Ich hab zwar auch mit dem AmigaBasic Handbuch angefangen, aber das war 
im letzten Jahrhundert und da war Internet noch in weiter Ferne.

Bei einem Bekannten stehen eine Menge C, C++, JS, Ruby... Bücher im 
Regal - und verstauben. Weil man Infos einfach schneller im Internet 
findet.

von Carl D. (jcw2)


Lesenswert?

M.K. B. schrieb:
> An den Kommentaren von einigen Vorgänger (Trolle ausgenommen), merkt
> man, dass diese die Neuerungen in den C++ Standards noch nicht
> mitbekommen haben. Das soll auch gar kein Vorwurf sein, weil man je nach
> Buch oder sonstiger Quelle gar nicht drauf kommt.
>
> Schau dir sonst mal diesen Vortrag:
> https://www.youtube.com/watch?v=7DTlWPgX6zs
>
> Josuttis stellt sich auch die Frage, was man jetzt verwenden soll, was
> aber gar nicht so leicht zu entscheiden ist.

Das eigentliche Problem ist, daß Neuerungen wegen der sehr 
verständlichen Regeln "Never break existing code" nie ihre Vorgänger 
vollständig ersetzen. Das Alte bleibt und kann jederzeit als Argument 
gegen die Sprache verwendet werden.
Bei vielen anderen Sprachen kann man auch Leichen ausgraben, wenn man 
will, nur macht man das bei erfolgreichen natürlich lieber.

von nocheinGast (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Schön, wenn ich Dir helfen konnte.
>
> Tipp: solche Fragen stellt man am besten bei stackoverflow statt hier
> ;-)

Ich bin nicht der TO, ich war nur ziemlich genervt von den Posts 
zwischen der Frage und deiner Antwort :).

von Jim M. (turboj)


Lesenswert?

Karl K. schrieb:
> Mal ehrlich, kauft sich einer im Jahr 2018 noch totes Holz für sowas?

Wer hat hier was von kaufen erzählt? Bibliotheken sollten immer noch 
existieren - und da kann man IMHO auch einführende Literatur zu C/C++ 
finden.

Karl K. schrieb:
> Weil man Infos einfach schneller im Internet
> findet.

Weil man sich an die Stichworte aus den Büchern erinnert.

Es soll auch noch Menschen geben die längere Texte lieber auf Totholz 
als am Bildschirm lesen.

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hi bambam,

auf eine Sache würde ich dich gern hinweisen.

Die diversen Dokumente über {} vs () weisen manchmal darauf hin, dass 
wenn Du {} benutzt ein Problem entstehen kann, wenn es einen Constructor 
gibt, der std::initializer_list nimmt. Dann führen () und {} zu 
unterschiedlichem Verhalten.

Das ist zum Beispiel bei std::vector der Fall.

std::vector<int>(1000, 42) macht einen Vektor mit 1000 Elementen vom 
Wert 42, std::vector<int>{1000, 42} macht einen Vektor mit den 
angegebenen 2 Elementen.

vlg
 Timm

von Vincent H. (vinci)


Lesenswert?

Ich persönlich benutz überall wos geht {}, selbst wenn ich ein int 
initialisier.

von Jobst Q. (joquis)


Lesenswert?

Daniel V. schrieb:
> In C und C++ grenzen die geschweifte Klammern eine Funktion ein z.B. If,
> while, for, switch usw werden mit {} abgeschossen.

Stimmt so nicht. Das geht auch ohne {}, wenn nur eine Anweisung folgt. 
Mit {} gilt das if,else, while for ... für den ganze Block von 
Anweisungen zwischen den Klammern.

Runde Klammern umgeben die Bedingungen bei if,while usw sowie die 
Parameter eines Funktionsaufrufes. Außerdem sind sie paarweise optional 
einsetzbar, um den Code übersichtlicher zu machen.

von Rolf M. (rmagnus)


Lesenswert?

Man kann so einen Block auch mit runden Klammern machen:
1
#include <stdio.h>
2
3
void hello(int a, int b)
4
{
5
    printf("Hello, numbers are %d and %d\n", a, b);
6
}
7
8
int main(int argc, char* argv[])
9
{
10
    int x, y;
11
    if (argc > 1)
12
    (
13
       x = 5,
14
       y = 3,
15
       hello(x, y)
16
    );
17
}

von Jobst Q. (joquis)


Lesenswert?

Rolf M. schrieb:
> if (argc > 1)
>     (
>        x = 5,
>        y = 3,
>        hello(x, y)
>     );

Das ist aber nur eine Anweisung, die mit nur einem ';' abgeschlossen 
ist. Sie ist nur mit ',' unterteilt. Die () spielen vermutlich gar keine 
Rolle, hab es aber nicht ausgetestet.

Auf jeden Fall sind {} und () nicht gegeneinander austauschbar.

: Bearbeitet durch User
von hallodri (Gast)


Lesenswert?

{} klammern einen block begin..end

() klammern einen ausdruck for ()

allerdings gibt es noch ein paar feinheiten ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.