Maison >développement back-end >C++ >Pourquoi `-1 < a.size()` est-il évalué à False pour un `std::vector` ?
std::vector Size Negation Paradox: Dévoilé
Dans un programme déroutant, nous observons que la comparaison -1 < a.size() est évalué à false, bien que la taille de std::vector
Comprendre les types intégraux non signés
Le membre size de std::vector renvoie un type intégral non signé. Les types intégraux non signés représentent exclusivement des entiers positifs, n'ayant pas la capacité de stocker des valeurs négatives. Lorsqu'une valeur négative est rencontrée avec un type non signé, elle est automatiquement convertie en une grande valeur positive via un processus appelé conversion du complément à deux.
Promotion de type en comparaison
Dans la comparaison -1 < a.size(), l'entier signé -1 est implicitement promu en entier non signé avant d'être comparé à a.size(). Cela transforme efficacement -1 en une grande valeur positive, rendant la comparaison fausse.
Exemple illustratif
L'extrait de code suivant démontre le même comportement sur les types fondamentaux :
#includeint main() { std::cout << std::boolalpha; unsigned int a = 0; int b = -1; std::cout << (b < a) << "\n"; // prints false } Dans cet exemple, l'entier signé -1 est promu en entier non signé avant d'être comparé à a. Par conséquent, le résultat est faux.
Conclusion
En résumé, le comportement déroutant observé dans la comparaison std::vector originale découle de la promotion de type d'entiers négatifs lorsque par rapport aux types non signés. L’entier négatif est effectivement converti en une grande valeur positive, ce qui entraîne un résultat inattendu. Il est recommandé d'éviter de comparer des entiers signés et non signés sans convertir explicitement la valeur signée en type non signé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!