Question

Supposons que j'ai ce (C ++ ou peut-être C) Code:

vector<int> my_vector;
for (int i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

Je ne me soucie pas si elle est bien fait. L'important est dans la boucle for déclaration. Le compilateur donne une signature / non-concordance non signé pour cela, puisque la taille () retourne un entier non signé, pas celui signé. Quelle est l'importance de changer unsigned i? Je déclare compteurs de boucle comme ints par habitude, mais si cela est une erreur potentielle que je vais me forcer à se sortir de l'habitude.

Était-ce utile?

La solution

Je dirais qu'il est très important - vous devriez compilez avec des avertissements comme des erreurs, et nous nous efforçons de corriger tous les avertissements. Si vous laissez des problèmes comme celui-ci dans votre code, il est facile d'entrer dans l'habitude d'ignorer les avertissements, ou de laisser les faux positifs comme celui-ci étouffent les avertissements qui indiquent des problèmes réels.

Dans ce cas, cette erreur spécifique, il est probablement pas une grosse affaire - sur une plate-forme 32 bits, vous devriez avoir plus de 2 milliards d'entrées dans le vecteur avant que le non signé enveloppait dans une valeur signée négative. Pour obtenir un vecteur comme ceci épuiserait toute votre mémoire, il est donc probablement pas possible d'entrer dans un état où signed / décalage non signé importerait.

Autres conseils

Techniquement, devrait être un i vector<int>::size_type. Vous devriez prendre l'habitude d'utiliser s dans votre typedef code:

typedef vector<int> VectorType;
VectorType my_vector;
for (VectorType::size_type i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

Maintenant, si nous changeons à un deque, nous changeons une seule ligne. Même si elle est un peu conteneur personnalisé qui a un size_type loufoque, vous obtenez le sentiment chaud et floue que tout sera ok. Et cela vaut beaucoup. Même avec juste non signé / signé, il y a quelques problèmes de promotion délicate à l'utilisation signé / conversion non signé qui va inévitablement revenir à vous mordre.

Cela peut être important dans le cas peu probable que la taille du vecteur dépasse INT_MAX. Si la taille du vecteur est supérieure à la valeur maximale qui peut être représentée dans un signé int, votre boucle ne se terminera jamais.

Eh bien, il est important parce que les entiers signés ont signe, pour que je puisse aller tout le chemin jusqu'à devenir une valeur négative, alors peu importe comment elle est grande, il serait encore inférieure à la taille (), qui ne marche pas avoir le moindre signe.

  

11111111 <10000000

Sur la plupart des cas de votre exemple, il ne sera pas question. mais quand votre programme ne fonctionne pas, la première chose que vous faites (ou devrait) est pour vous assurer qu'il n'y a aucun avertissement, il est donc une chance de ne pas la peine de prendre.

assurez-vous qu'il ya aussi quelques avertissements possibles.

Comme dit ci-dessus, utilisez vecteur :: size_type; ou utiliser un itérateur à boucle à travers votre vecteur. Assurez-vous de gérer tous vos propres avertissements comme des erreurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top