La plupart du temps, nous utilisons le type entier pour représenter les variables d'index. Mais dans certaines situations, nous sommes obligés de choisir
std::vector<int> vec;
....
for(int i = 0; i < vec.size(); ++i)
....
Cela entraînera le compilateur à déclencher l'avertissement que l'utilisation mixte de variables signées / non signées. si je crée la variable d'index en tant que for( size_t i = 0; i < vec.size(); i++ )
(ou an unsigned int
), cela résoudra les problèmes.
Lorsqu'il est plus spécifique d'utiliser des types de fenêtres, la plupart des API Windows traitent avec DWORD (qui est typé comme non signé depuis longtemps).
Donc, lorsque j'utilise une itération similaire, cela provoquera à nouveau le même avertissement. Maintenant, si je le réécris comme
DWORD dwCount;
....
for(DWORD i = 0; i < dwCount; ++i)
....
Je trouve ça un peu bizarre. Ce pourrait être le problème avec les perceptions.
Je suis d'accord que nous sommes censés utiliser le même type de variable d'index pour éviter que les problèmes de plage ne se produisent avec les variables d'index. Par exemple, si nous utilisons
_int64 i64Count; //
....
for(_int64 i = 0; i < i64Count; ++i)
....
Mais dans le cas de DWORD, ou d'entiers non signés, y a-t-il des problèmes à le réécrire comme
for(int i = 0; (size_t)i < vec.size(); ++i)
Comment la plupart des gens travaillent avec des problèmes similaires?
std::size_t
c'est un rang plus élevé que int (ou même long). Si jamais la taille du vecteur dépasse std::numeric_limits<int>::max()
, vous regretterez d'avoir utilisé int.