Il ciclo "for".

Quel che tutti stanno cercando di dirti, tra le righe, è il for non ha nulla di strano. C'è una fase di inizializzazione, una sequenza di istruzioni che si ripetono finché una condizione è vera e infine una fase di incremento eseguita al termine della sequenza di istruzioni, alla fine di ogni ripetizione. Fine, non c'è altro.

Quel che ti sta traendo in inganno è invece l'aritmetica modulare:

for (unsigned int i = 100; i >= 0; --i) {
}

Ora, è chiaro che i parte da 100. Viene valutata la condizione: 100 >= 0, quindi viene eseguito il blocco di istruzioni. Poi avviene l'"incremento", che in questo caso è in realtà un decremento: i = 100 - 1, quindi i = 99. Viene rivalutata la condizione: 99 >= 0, quindi si ripete il blocco, ecc ecc...

Questo ovviamente avviene per circa 100 volte, poi vediamo cosa succede quando i arriva a valere 1: al momento del decremento i = 1 - 1 = 0. La condizione 0 >= 0 è ancora vera, quindi si ripete ancora una volta il blocco. Siamo di nuovo al decremento: i = 0 - 1, qua tu ti aspetti che i vada a valere -1, ma non è così, perché la tua variabile è espressamente dichiarata unsigned, quindi senza segno, e non può diventare negativa. Per le proprietà dell'aritmetica binaria modulare, ti dico io che succederà che i = 65535. Ovviamente 65535 >= 0, quindi il ciclo si ripete ancora, poi i verrà decrementata e il ciclo continuerà, ma non succederà MAI che i non sia >= 0, data la mancanza di segno della variabile, per cui di fatto non uscirai MAI dal ciclo.

Ma, ribadisco, questo ha poco a che vedere col for, sei TU che hai deciso di dichiarare la tua variabile unsigned, e sei TU che devi gestirla in maniera sensata. Devi studiare l'aritmetica binaria, la sua modularità e le limitazioni numeriche dei vari tipi.