SukkoPera:
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 [u]non può diventare negativa[/u]. 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 [u]non uscirai MAI dal ciclo[/u]. 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.
Grazie per la chiara ed esaustiva spigazione, ora non devo far altro che rivedere i vari casi testati.