Usiamo il tipo intero che rappresenta le variabili indice per la maggior parte del tempo. Ma in alcune situazioni, siamo costretti a scegliere
std::vector<int> vec;
....
for(int i = 0; i < vec.size(); ++i)
....
Ciò farà sì che il compilatore sollevi l'avvertimento che l'uso misto di variabili firmate / non firmate. se faccio l'indice variabile come for( size_t i = 0; i < vec.size(); i++ )
, (o un unsigned int
) risolverà i problemi.
Quando diventa più specifico usare i tipi di Windows, la maggior parte delle API di Windows hanno a che fare con DWORD (che è stato tipizzato come unsigned long).
Quindi, quando utilizzo un'iterazione simile, causerà nuovamente lo stesso avviso. Ora se lo riscrivo come
DWORD dwCount;
....
for(DWORD i = 0; i < dwCount; ++i)
....
Lo trovo un po 'strano. Potrebbe essere il problema con le percezioni.
Concordo sul fatto che dovremmo utilizzare lo stesso tipo di variabile indice per evitare che si possano verificare problemi di intervallo con le variabili indice. Per esempio se stiamo usando
_int64 i64Count; //
....
for(_int64 i = 0; i < i64Count; ++i)
....
Ma nel caso di DWORD, o numeri interi senza segno, ci sono problemi a riscriverlo come
for(int i = 0; (size_t)i < vec.size(); ++i)
In che modo la maggior parte delle persone lavora con problemi simili?
std::size_t
è un rango più alto di int (o addirittura lungo). Se la dimensione del vettore supera mai std::numeric_limits<int>::max()
, ti pentirai di aver usato int.