Maison > développement back-end > C++ > Pourquoi comparer -1 à la taille d'un vecteur vide donne-t-il « plus grand » en C ?

Pourquoi comparer -1 à la taille d'un vecteur vide donne-t-il « plus grand » en C ?

Mary-Kate Olsen
Libérer: 2024-12-07 22:42:14
original
780 Les gens l'ont consulté

Why Does Comparing -1 to an Empty Vector's Size Result in

Pourquoi comparer -1 à la taille d'un vecteur de 0 donne "Plus grand"

Le puzzle

En C , l'extrait de code suivant produit le sortie inattendue de "Plus grand":

#include <iostream>
#include <vector>

int main() {
    std::vector<int> a;
    std::cout << "vector size " << a.size() << std::endl;

    int b = -1;
    if (b < a.size())
        std::cout << "Less";
    else
        std::cout << "Greater";
}
Copier après la connexion

Sortie :

vector size 0
Greater
Copier après la connexion

Révéler le mystère

La raison derrière ce comportement contre-intuitif réside dans la différence de type entre les valeurs comparées. a.size() renvoie un entier non signé, représentant la taille non négative du vecteur. D'un autre côté, b est un entier signé, contenant la valeur négative -1.

Lors de la comparaison de ces deux valeurs, C effectue une promotion implicite vers non signé. En conséquence, b est promu en un grand entier non signé, qui est ensuite comparé au a.size() non signé. La grande valeur non signée dépasse 0, conduisant à la sortie « Supérieure ».

Un exemple clarifiant

Ce comportement peut être illustré davantage par le code suivant :

#include <iostream>

int main()
{
    unsigned int a = 0;
    int b = -1;
    std::cout << std::boolalpha << (b < a) << "\n"; 
}
Copier après la connexion

Sortie :

false
Copier après la connexion

Ici, nous comparons directement un type non signé (a) avec un type signé (b). La valeur négative b est promue en un grand entier non signé, qui est à juste titre considéré comme supérieur au a non signé avec une valeur de 0.

Conclusion

Comprendre les différences de type et les règles de promotion implicites est crucial pour travailler avec des valeurs signées et non signées en C . Lorsque l'on compare des entiers de différents types, il est important de considérer la manière dont ils sont promus et si la comparaison qui en résulte est significative.

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