Maison >développement back-end >C++ >Pourquoi `-1 < a.size()` est-il évalué à False pour un `std::vector` ?

Pourquoi `-1 < a.size()` est-il évalué à False pour un `std::vector` ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-10 10:03:09597parcourir

Why Does `-1 < a.size()` Evaluate to False for a `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 soit intrinsèquement positive. Ce comportement déroutant provient des types de données sous-jacents impliqués.

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 :

#include 

int 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn