Forum: Mikrocontroller und Digitale Elektronik C++ Struktur in Schleife inizialisieren unartig?


von X. H. (shadow0815)


Lesenswert?

Hi!

Man kann ja Stukturen mit
1
STR str={3,5,"lalala"};
nur inizialisieren bei der Deklaration, und nicht später:
1
str={3,5,"lalala"}; //Error! - Nur bei Deklaration erlaubt!

In C++ kann ich nun aber folgendes machen:
1
#include <iostream>
2
char ajdlksfjkspause;
3
#define Pause() ajdlksfjkspause=getc(stdin); 
4
using namespace std;
5
6
int main(int argc, char *argv[])
7
{
8
    typedef struct {int a;int b;}VAR;
9
    int thea=2;
10
    
11
    for(int theb=0;theb<100;theb++)
12
    {
13
       VAR var={thea,theb}; // <--- is dies ungezogen?
14
       cout<<"---> a: "<<var.a<<" b: "<<var.b<<endl;
15
    }
16
 Pause();
17
}

Und es funktioniert. Beim ersten Durchlauf der Schleife wird das var
deklariert und mit {thea,theb} inizialisiert.
Beim Nächsten Durchlauf auch wieder, obwohl es die Variable ja schon 
gibt. Comiler meint wohl: "Egal, steht der Typ VAR vor, darf also immer 
wieder neu
inizialisiert werden...?!"

Gehört sowas zu unsauberem Programmierstil?
Es geht so schön schnell, wenn man mal z.B. ein Rechteck definieren 
will:

bsp.:
1
int a=50;
2
int b=100;
3
SDL_Rect rect={50,50,a,b};

von Karl H. (kbuchegg)


Lesenswert?

X. H. wrote:
> Hi!
>
> Man kann ja Stukturen mit
>
1
STR str={3,5,"lalala"};
> nur inizialisieren bei der Deklaration, und nicht später:
>

Richtig

>
1
str={3,5,"lalala"}; //Error! - Nur bei Deklaration erlaubt!

Auch richtig. Das ist keine Initialisierung sondern eine
Zuweisung.

>
> In C++ kann ich nun aber folgendes machen:
>
1
> #include <iostream>
2
> char ajdlksfjkspause;
3
> #define Pause() ajdlksfjkspause=getc(stdin);
4
> using namespace std;
5
> 
6
> int main(int argc, char *argv[])
7
> {
8
>     typedef struct {int a;int b;}VAR;
9
>     int thea=2;
10
> 
11
>     for(int theb=0;theb<100;theb++)
12
>     {
13
>        VAR var={thea,theb}; // <--- is dies ungezogen?
14
>        cout<<"---> a: "<<var.a<<" b: "<<var.b<<endl;
15
>     }
16
>  Pause();
17
> }
18
>
>
> Und es funktioniert. Beim ersten Durchlauf der Schleife wird das var
> deklariert und mit {thea,theb} inizialisiert.

Bei jedem Durchlauf wird eine Variable var erzeugt und
initialisiert. Sobald das } erreicht wird, ist die
Lebenszeit für var abgelaufen und es wird zerstört.
Wird der Schleifenkörper erneut betreten, so wird wieder
eine naue Variable var erzeugt.

> Beim Nächsten Durchlauf auch wieder, obwohl es die Variable ja schon
> gibt.
>
> Comiler: "Egal, steht der Typ VAR vor, darf also immer wieder neu
> inizialisiert werden...?"

Das ist, na ja, etwas fremdartig formuliert.
Du solltest dir nochmal die sog. 'Scope-Regeln' für Variablen
zu Gemüte führen.
Kurz gesagt: Bei der Deklaration einer Variablen wird sie
erzeugt (und auch möglicheriweise initialisiert). Die Variable
stirbt, wenn der Block in dem sie deklariert wurde, zu Ende ist
(wenn also das Block abschliessende } erreicht wird).

>
> Gehört sowas zu unsauberem Programmierstil?

Nein. wieso sollte es?
Wenn du in jedem Schleifendurchlauf eine neue Variable haben
willst, dann ist das so.

> Es geht so schön schnell, wenn man mal z.B. ein Rechteck definieren
> will:
>
> bsp.:
>
1
> int a=50;
2
> int b=100;
3
> SDL_Rect rect={50,50,a,b};
4
>

Spricht nichts dagegen.
Ganz im Gegenteil. Man versucht Variablen erst dann zu
deklarieren (und damit auch zu initialisieren) wenn sie
tatsächlich gebraucht werden.

von X. H. (shadow0815)


Lesenswert?

Danke für die Aufklärung.
Hab was ähnliches auch noch in C geschrieben und gemerkt dass es da ja 
auch erlaubt ist :)

Bin nicht drauf gekommen, dass eine Whileschleife mit {}
wieder ein Block für sich ist, weil das ja eben die Eigenschaft der 
Block-Klammer ist und darin dann wieder lokale variablen vorhanden sein 
können, die eben nur einen Schleifenzyklus überleben.

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.