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 | }
|
|
Forum: Compiler & IDEs for-Schleife und dekrementierenWer hilft mir, bei der Demontage meines Brett vorm Kopf? geht nicht:
geht:
die Bedingnung in der for schleife ist einfach immer true, oder was geht nicht? Walter 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. 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. 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! 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. :-\ 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.
|
|