Da un punto di vista linguistico, non c'è nulla da mettere in guardia. i
viene promosso a unsigned int
prima che venga valutato lo <
. Ed è perfettamente ben definito per incrementare uno unsigned char
in modo tale da portarlo a zero.
Il fatto che questo codice faccia qualcosa di irritante è sfortunato. Ma non è chiaro quale regola debba essere applicato da un compilatore per rilevare questo tipo di cose.
Grazie alla @unwind nei commenti qui sotto: è possibile ottenere GCC per mettere in guardia circa il fatto che questo confronto deve essere sempre valutata come vera utilizzando il flag -Wtype-limits
.
Aggiornamento 2: A quanto pare l'opzione di cui sopra non funziona in questo caso (non ho una versione "moderna" di GCC a portata di mano in questo momento ...)
fonte
2013-03-21 10:50:54
Mostra le bandiere di costruzione, quali avvisi stai richiedendo? – unwind
Perché l'avviso non è un comportamento predefinito, quindi è necessario creare un caso * per * avviso? – Jon
fw, c'è un avvertimento se si contrassegna 'test' come' const'. – mitchnull