Durante il confronto (i <= u)
, i
viene aggiornato a un intero senza segno, e nel processo -1 viene convertito UINT_MAX.
Una conversione di un numero negativo a un unsigned int aggiungerà (UINT_MAX + 1) a quel numero, in modo da -1 diventa UINT_MAX, -2 diventa UINT_MAX - 1, ecc
Se ci pensate, uno doveva essere convertito all'altro affinché il confronto potesse funzionare, e di norma il compilatore converte il valore firmato in non firmato. In questo caso, ovviamente, avrebbe più senso convertire il valore unsigned in signed, ma il compilatore non può semplicemente decidere di seguire una specifica diversa in base a ciò che si intende. È necessario eseguire il cast esplicito dell'int unsigned per firmarlo (o semplicemente averlo come firmato per intero) qui.
Per inciso, si dovrebbe usare 'std :: endl' invece di inserire' \ n' in un flusso, perché 'std :: endl' sia è portatile e assicura che l'output sia visualizzato immediatamente. –
@ Ben: '\ n' è altrettanto portatile; dovresti usare solo "endl" se vuoi che il flusso venga scaricato in questo momento. –
'\ n' è portatile (viene convertito alla sequenza di interruzione di riga della piattaforma) e non comporta il sovraccarico di scarico immediato del flusso. Dovresti usare quello che ha la semantica che vuoi: se vuoi che il flusso venga svuotato, usa 'endl', se vuoi solo un'interruzione di riga, usa' \ n'. – jalf