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
Libérer: 2024-12-10 10:03:09
original
600 Les gens l'ont consulté

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal