Was uns dann wieder mal zum Thema bringt:
1 | "Welchen Einfluss hat eine saubere Codeformatierung und Einrückung auf
|
2 | die Fähigkeit des Programmierers, Fehler selbst zu sehen?"
|
Aus genau dem gleichen Grund schreib ich zb so etwas
1 | while (!(ADCSRA & (1<<ADIF))); // WARTEN BIS FERTIG
|
immer so
1 | while (!(ADCSRA & (1<<ADIF))) // WARTEN BIS FERTIG
|
2 | ;
|
dann sieht man schneller, dass das hier eine leere Schleife ist, deren
ganzer Zweck sich in der Abbruchbedingung verbirgt.
Technisch gesehen gehört der ; sowieso zum nächsten (in dem Fall leeren)
Statement und nicht zum while. Ein while (genauso wie ein for oder ein
if oder ein do) wird nicht mit einem ; abgeschlossen.
Wer seinen Coding Stil daher so aufbaut
1 | while( Bedingung )
|
2 | Anweisung;
|
(also: die abhängige Anweisung kommt immer eingerückt in die nächste
Zeile), der handelt nur konsequent, wenn er das auch mit der leeren
Anweisung so handhabt. Denn auch eine leere Anweisung ist eine
Anweisung:
1 | while( Bedingung )
|
2 | ; // tu nichts, Jaa das ist eine leere Anweisung. So etwas gibt es!
|
Dieser ; ist wichtig und es ist wichtig, dass der heraussticht und sich
nicht in den Zeichen einer Zeile versteckt, wo ihn keiner sieht.
Besonders fies ist hier natürlich die konkrete Codefortstzung ...
1 | while (!(ADCSRA & (1<<ADIF))); // WARTEN BIS FERTIG
|
2 |
|
3 | {
|
4 | PORTB &= ~(1 << SS); //SS LOW
|
5 | SPDR = ADCH;
|
6 | while(!(SPSR & (1<<SPIF)));
|
7 | PORTB |= (1 << SS); // SS HIGH
|
8 | _delay_ms(100);
|
9 | }
|
... bei der es auf den ersten Blick so aussieht, als ob der
darauffolgende Block vom while abhängig ist. Das er es nicht ist, sieht
man erst, wenn man den ; entdeckt hat
1 | while (!(ADCSRA & (1<<ADIF))) // WARTEN BIS FERTIG
|
2 | ;
|
3 |
|
4 | {
|
5 | PORTB &= ~(1 << SS); //SS LOW
|
6 | SPDR = ADCH;
|
7 | while(!(SPSR & (1<<SPIF)))
|
8 | ;
|
9 | PORTB |= (1 << SS); // SS HIGH
|
10 | _delay_ms(100);
|
11 | }
|
So ist es IMHO ein bischen besser zu sehen, dass der Block nichts mit
dem while zu tun hat.