Zum Thema formatieren
* eine einzige Leerzeile zwischen funktionalen Blöcken ist ok.
  Die Leerzeile sorgt für eine optische Gruppierung und leitet
  dich beim Lesen. Sie sagt dir: hier ist ein Gedankengang zu Ende
  und eine neuer Gedanke beginnt.
  Das macht EINE Leerzeile.
  Viele Leerzeilen hintereinander hingegen bringen nichts. Sie ziehen
  den Code nur in die Länge und bewirken das Gegenteil. Die Übersicht
  steigt nicht, sondern sie nimmt ab. Eben weil der Code unnötigerweise
  in die Länge gezogen wird.
* nach jeder öffnenden Klammer { beginnt ein neuer sog. Code-Block.
  um den Code-Block erkennen zu können ohne jedesmal die
  einschliessenden { } suchen zu müssen, wird der Block eingerückt.
  Nach einer { wird der zum Block gehörende Code um 2 Leerzeichen
  eingerückt. Diese Einrückung wird erst wieder mit der schliessenden }
  wieder aufgehoben. Die schliessende } steht auf der selben
  Einrücktiefe wie entweder die { selber oder wie die Anweisung in der
  die { zu finden ist. Auf die Art braucht man nur immer einfach nur
  in derselben Spalte nach oben oder nach unten im Code zu gehen um
  die jeweils korrespondierende { oder } zu finden und zu sehen, welchen
  Code die { } in einen Codeblock einschliessen.
Die erste Einrückversion sieht so aus| 1 | int main()
 | 
| 2 | {
 | 
| 3 |   // einrücken
 | 
| 4 | 
 | 
| 5 |   ...
 | 
| 6 | 
 | 
| 7 |   while( 1 )
 | 
| 8 |   {
 | 
| 9 |     // einrücken
 | 
| 10 | 
 | 
| 11 |     if( PIND & ( 1 << PD2 ) )
 | 
| 12 |     {
 | 
| 13 |       // einrücken
 | 
| 14 |       PORTB = 5;
 | 
| 15 |       // Block ist zu Ende, also für die } ausrücken
 | 
| 16 |     }
 | 
| 17 |     else
 | 
| 18 |     {
 | 
| 19 |       // einrücken
 | 
| 20 |       PORTB = 8;
 | 
| 21 |       // ausrücken
 | 
| 22 |     }
 | 
| 23 | 
 | 
| 24 |     // Block zu Ende, es fehlt noch eine } für das while
 | 
| 25 |     // also ausrücken
 | 
| 26 |   }
 | 
| 27 | 
 | 
| 28 |   // und es fehlt noch ein } für die { nach dem int main()
 | 
| 29 | }
 | 
die andere Version sieht so aus (jetzt ohne die blödsinnigen 
einrücken/ausrücken Kommentare. Die schreibt man natürlich nicht 
wirklich)
| 1 | int main()
 | 
| 2 | {
 | 
| 3 |   ...
 | 
| 4 | 
 | 
| 5 |   while( 1 ) {
 | 
| 6 | 
 | 
| 7 |     if( PIND & ( 1 << PD2 ) ) {
 | 
| 8 |       PORTB = 5;
 | 
| 9 |     }
 | 
| 10 |     else {
 | 
| 11 |       PORTB = 8;
 | 
| 12 |     }
 | 
| 13 |   }
 | 
| 14 | }
 | 
Die Variante, in der die öffnende { auf derselben Zeile steht (mit 
Ausnahme nach einem Funktionskopf) ist etwas platzsparender als die 
Variante, in der die { ihre eigene Zeile bekommt. Aber ansonsten sind 
die Dinge gleichwertig: Nach einem { wird eingerückt. Die schliessende } 
wird wieder ausgerückt.
Am Ende einer Funktion muss die schliessende } wieder am linken Rand 
stehen. Sonst stimmt irgendwo mit den { und } etwas nicht.
Aber auf keinen Fall kann es sein, dass eine Anweisung am linken Rand 
anfängt.