Forum: Compiler & IDEs for-Schleife und dekrementieren


von Herb (Gast)


Lesenswert?

Wer hilft mir, bei der Demontage meines Brett vorm Kopf?

geht nicht:
1
uint8_t i;
2
for (i = 255; i>=0; i--)
3
{
4
  // irgendwas
5
}

geht:
1
long i;
2
for (i = 255; i>=0; i--)
3
{
4
  // irgendwas
5
}

von Walter (Gast)


Lesenswert?

die Bedingnung in der for schleife ist einfach immer true,
oder was geht nicht?

Walter

von Simon K. (simon) Benutzerseite


Lesenswert?

Das liegt daran, dass "long" ein signed Datentyp ist. Und da deine 
For-Schleife solange läuft, wie die Iterationsvariable größer oder 
gleich 0 ist (Also die Schleife nur abbricht, wenn die Variable auf -1 
dekrementiert wird), funktioniert das nicht mit einem unsigned-Typ (wie 
der uint8_t).

Das "Sign" ist in diesem Fall das Vorzeichen. Ein unsigned-Typ hat also 
kein Vorzeichen.

von Ekschperde (Gast)


Lesenswert?

uint8_t i; wär ja wohl ein unsigned char, wertebereich: 0 ... 255.

Der kann nicht kleiner als 0 werden ;-)

Ein long schon, weil signed.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Die Begründung hast du ja schon.

Ersetze die erste Schrleife z.B. durch

uint8_t i;
i = 255;
do
{
  // irgendwas
} while(i--);

Frohes Fest!

von Herb (Gast)


Lesenswert?

Oh mann!
Danke für die Hilfe. War ein dickes Brett. Habe klar übersehen, daß vor 
dem Vergleich dekrementiert wird und dann ja -1 raus kommt.
:-\

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Nee, nicht richtig. -1 kann nie rauskommen, weil i im ersten Beispiel 
ein unsigned Datentyp ist, d.h. ohne Vorzeichen, d.h. immer positiv oder 
gleich null. Du hättest wenn i gleich 0 ist in der nächsten Schleife 
beim Dekrementieren einen Überlauf und i wäre 255 (wegen 8-Bit in 
uint8_t). Du hast dann mit der ersten for-Schleife eine unsaubere 
Endlosschleife produziert.

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.